class curveSegment { float xStart, yStart, xB1, yB1, xB2, yB2, xEnd, yEnd; float currentXStart, currentYStart, currentXB1, currentYB1, currentXB2, currentYB2, currentXEnd, currentYEnd; float percentCompleted1, percentCompleted2, percentCompleted3; float drift1XB1, drift1YB1, drift1XB2, drift1YB2; float drift2XB1, drift2YB1, drift2XB2, drift2YB2; float vel1XB1, vel1YB1, vel1XB2, vel1YB2; float vel2XB1, vel2YB1, vel2XB2, vel2YB2; color curveColor, currentColor, blackout, fadein; int behaviorMode, totalFrames1, framesCompleted1, totalFrames2, framesCompleted2, totalFrames3, framesCompleted3; /* current behavior modes: 0 = not drawing 1 = static drawing (or evolving bezier points) with fading color 2 = drawing from beginning to end (transitioning to mode 1 at completion) 3 = drawing from beginning to end (transitioning to mode 4 at completion) 4 = "erasing" from beginning to end */ curveSegment() { blackout = color(1, 1, 1, 1); fadein = color(10, 10, 10, 10); behaviorMode = 0; } void initialize(float xa, float ya, float xb, float yb, float xc, float yc, float xd, float yd, color cc) { xStart = xa; yStart = ya; xB1 = xb; yB1 = yb; xB2 = xc; yB2 = yc; xEnd = xd; yEnd = yd; currentXStart = xa; currentYStart = ya; currentXB1 = xa; currentYB1 = ya; currentXB2 = xd; currentYB2 = yd; currentXEnd = xa; currentYEnd = yb; curveColor = cc; } void paint() { switch(behaviorMode) { case 1: stroke(currentColor); bezier(xStart, yStart, currentXB1, currentYB1, currentXB2, currentYB2, xEnd, yEnd); bezier(xStart, yStart, drift1XB1, drift1YB1, drift1XB2, drift1YB2, xEnd, yEnd); bezier(xStart, yStart, drift2XB1, drift2YB1, drift2XB2, drift2YB2, xEnd, yEnd); break; case 2: case 3: stroke(currentColor); bezier(xStart, yStart, currentXB1, currentYB1, currentXB2, currentYB2, currentXEnd, currentYEnd); break; case 4: stroke(currentColor); bezier(currentXStart, currentYStart, currentXB1, currentYB1, currentXB2, currentYB2, xEnd, yEnd); break; default: break; } } void update() { switch(behaviorMode) { case 2: case 3: if(percentCompleted1 < 1.0) { framesCompleted1 = framesCompleted1 + 1; percentCompleted1 = float(framesCompleted1) / totalFrames1; currentXB1 = lerp(xStart, xB1, percentCompleted1); currentYB1 = lerp(yStart, yB1, percentCompleted1); currentXB2 = lerp(xStart, xB2, percentCompleted1); // changed End to Start currentYB2 = lerp(yStart, yB2, percentCompleted1); // changed End to Start currentXEnd = lerp(xStart, xEnd, percentCompleted1); currentYEnd = lerp(yStart, yEnd, percentCompleted1); currentColor = curveColor; } else if(behaviorMode == 2) { behaviorMode = 1; drift1XB1 = currentXB1; drift1YB1 = currentYB1; drift1XB2 = currentXB2; drift1YB2 = currentYB2; drift2XB1 = currentXB1; drift2YB1 = currentYB1; drift2XB2 = currentXB2; drift2YB2 = currentYB2; } else if(behaviorMode == 3) { behaviorMode = 4; } break; case 4: if(percentCompleted3 < 1.0) { framesCompleted3 = framesCompleted3 + 1; percentCompleted3 = float(framesCompleted3) / totalFrames3; currentXStart = lerp(xStart, xEnd, percentCompleted3); currentYStart = lerp(yStart, yEnd, percentCompleted3); currentXB1 = lerp(xB1, xEnd, percentCompleted3); currentYB1 = lerp(yB1, yEnd, percentCompleted3); currentXB2 = lerp(xB2, xEnd, percentCompleted3); currentYB2 = lerp(yB2, yEnd, percentCompleted3); currentColor = curveColor; } else { behaviorMode = 0; } break; case 1: if(percentCompleted2 < 1.0) { framesCompleted2 = framesCompleted2 + 1; percentCompleted2 = float(framesCompleted2) / totalFrames2; currentColor = lerpColor(curveColor, blackout, percentCompleted2); drift1XB1 = drift1XB1 + vel1XB1; drift1YB1 = drift1YB1 + vel1YB1; drift1XB2 = drift1XB2 + vel1XB2; drift1YB2 = drift1YB2 + vel1YB2; drift2XB1 = drift2XB1 + vel2XB1; drift2YB1 = drift2YB1 + vel2YB1; drift2XB2 = drift2XB2 + vel2XB2; drift2YB2 = drift2YB2 + vel2YB2; } else { behaviorMode = 0; } break; default: break; } } void activate(int f1, int f2, float v1, float v2, int b) { framesCompleted1 = 0; framesCompleted2 = 0; framesCompleted3 = 0; percentCompleted1 = 0.0; percentCompleted2 = 0.0; percentCompleted3 = 0.0; totalFrames1 = f1; totalFrames2 = f2; totalFrames3 = f2; behaviorMode = b; currentColor = fadein; vel1XB1 = random(v1, v2); vel1YB1 = random(v1, v2); vel1XB2 = random(v1, v2); vel1YB2 = random(v1, v2); vel2XB1 = random(v1, v2); vel2YB1 = random(v1, v2); vel2XB2 = random(v1, v2); vel2YB2 = random(v1, v2); } }