expo-processing/newton_fractal.pde

65 lines
2.1 KiB
Plaintext
Executable File

// newton fractal globals
PShader nf_myShader;
float nf_previousTime = 0.0;
boolean nf_mouseDragged = false;
PVector nf_lastMousePosition;
float nf_mouseClickState = 0.0;
void setup_newton_fractal()
{
// Load the shader file from the "data" folder
nf_myShader = loadShader("defaultShader.cpp");
// We assume the dimension of the window will not change over time,
// therefore we can pass its values in the setup() function
nf_myShader.set("iResolution", float(width), float(height), 0.0);
nf_lastMousePosition = new PVector(float(mouseX),float(mouseY));
// needed cuz noFill means no shader
fill(255);
noStroke();
}
void draw_newton_fractal()
{
// shader playback time (in seconds)
float currentTime = millis()/1000.0 - myTime;
nf_myShader.set("iTime", currentTime);
// render time (in seconds)
float timeDelta = currentTime - nf_previousTime;
nf_previousTime = currentTime;
nf_myShader.set("iDeltaTime", timeDelta);
// shader playback frame
nf_myShader.set("iFrame", frameCount);
// mouse pixel coords. xy: current (if MLB down), zw: click
if(mousePressed) {
nf_lastMousePosition.set(float(mouseX),float(mouseY));
nf_mouseClickState = 1.0;
} else {
nf_mouseClickState = 0.0;
}
nf_myShader.set( "iMouse", nf_lastMousePosition.x, nf_lastMousePosition.y, nf_mouseClickState, nf_mouseClickState);
// Set the date
// Note that iDate.y and iDate.z contain month-1 and day-1 respectively,
// while x does contain the year (see: https://www.shadertoy.com/view/ldKGRR)
float timeInSeconds = hour()*3600 + minute()*60 + second();
nf_myShader.set("iDate", year(), month()-1, day()-1, timeInSeconds );
// This uniform is undocumented so I have no idea what the range is
nf_myShader.set("iFrameRate", frameRate);
// Apply the specified shader to any geometry drawn from this point
shader(nf_myShader);
// Draw the output of the shader onto a rectangle that covers the whole viewport.
fill(255);
rect(0, 0, width, height);
resetShader();
}