I normally wouldn’t post about a pattern update but –
While fixing an annoying occasional phase offset glitch I noticed that my math for scaling wavelength to strip size was totally broken. Oasis looked great on the 10 meter strips I built it for, but it wasn’t doing the right thing on anything smaller. Now it does.
I’ve also added a user “wavelength” slider so you can adjust to taste. There’s also a new “Hue” slider for sunrise/sunset effects. Short video below shows the new version on a 16x16 matrix.
Already updated in my pattern repository, will update in the main Pixelblaze library shortly.
First off I really like it! One thing I noticed with Pacifica and your Oasis is that it looks fantastic as a led strip but to me looks “off” on a 2d matrix. I really can’t explain how it looks off but it doesn’t feel like it is flowing in 2d more only in 1d. Perhaps I need to play with the sliders. Perhaps because the four layers are changing in 1d of an array… I guess it might take a lot more arrays if you wanted the wave movement to be in 2d. Just thinking out loud.
@devoh,
It is a 1D pattern inherently and only has render, no render2D or render3D. Whipping up a 2D version that uses x and y would be a fun challenge
@zranger1 has some interesting parametric wave generator functions going on in there!
@devoh, as @wizard says, it’s fundamentally a 1D thing for now. I’ve got 2D wave patterns in the works though. They should work particularly well on Pixelblaze 3!
VERY cool @zranger1 ! I can’t wait to see that and play with it on my PB V3 when it arrives. Thanks for not taking what I said as a criticism. It is amazing what you did and looks really nice.
Man… way too many projects, way too little time! I do want to play with procedural noise - bet there are a bunch of ways to generate an interesting pattern. But the physics thing… the interactions between waves can look really cool. I’m thinking about a sound-reactive ripple tank for starters, something like this: http://www.falstad.com/ripple/ (click and drag the mouse around in the tank to see waves go everywhere.)
I assume it has to do with my array length which is 1440 pixels long. It looks like the n term becomes negative which obviously will index poorly into an array.
Yeah, setting the wavelength slider at one end or the other (I forget which) on a long strip can cause that. The fix is to just change the line to:
``511 * abs(n%1)```
You only have to do it on layer1 – the rest should be fine as is.
This is a classic integer overflow bug - in the line above the one that generates the error, the calculated value of n winds up being larger than 32767, which flips its sign bit.
I’ve put the "abs(n%1) patch in the repository version, and I’ll shortly reorder the calculations to keep it from happening again.
However, I question the use of abs, rather than just a simple limit function like [I said use min at first, forgetting that N would be negative, never mind that]
abs() works because I need only the fractional part, and it is still valid, even after the overflow.
(also, as a complete sidenote, abs() is just a hair faster than min(), and pretty much everything you can get the vm to do is faster than the same thing done in user code. Here’s the short pattern I use as a testbed for timing individual operations.)
// NOTE: test with LED Type set to No LEDs and pixel count set to 1
export function beforeRender(delta) {
for (i = 0; i < 3000; i++) {
var a = random(100) - 50 // -50 to 50
// a = a ^ (a >> 31) // abs by xor vs bit mask (43.4 fps @ 3000 iterations)
// a = abs(a); // system abs (50.2 fps @ " ")
// a = min(0, a) // system min (48.9 fps @ " ")
}
}
export function render(index) {
hsv(0, 1, 1)
}
Skylight, curtain, surround, vault… it would all be possible. Combine it with your fire code @zranger and wow!
The window above is an old 2030 single pane I took out of my 1950s house. It still has the aluminum surround so the leds stand away from the glass just a bit, adding to the apparent depth effect.
I can just see that skylight… beautiful. But yee gads!!!, another project.