function drawREGL() {
d3.select("#container").html("");
const container = document.getElementById("container");
const regl = createREGL({
container: container
});
const drawPoints = regl({
vert: `
precision mediump float;
attribute float speed, x, y0, y1, dy;
attribute float isB;
varying float c;
uniform float interp; // time / 40
void main() {
// 점의 이동거리: x + interp * speed (초기위치 + 시간 * 속도)
// mod(A, B) -> 나머지 계산, B가 1 이므로 (0, 1) 사이의 값 반환 (오른쪽 끝에가면 다시 원점에서 시작되게 됨)
// x축 보간인자 (일정하게 증가함)
float t = mod(x + interp * speed, 1.0);
// cubic ease
// y축 보간인자 (천천히 증가하다가 0.5에서 급격히 증가하고 천천히 감속함) (t값에 의해 정해짐)
float ct = t < 0.5
? 4.0 * t * t * t //시작할 때 천천히 움직이다가 점점 빨라지는 가속
: -0.5 * pow(abs(2.0 * t - 2.0), 3.0) + 1.0; // 천천히 감속하면서 끝남
// mix(A, B, c) -> A(시작), B(끝), c(보간인자, 0 - 1사이) -> linear interpolation
float x = mix(-1.0, 1.0, t);
float y = mix(y0, y1, ct);
gl_Position = vec4(x, y + dy, 0, 1);
gl_PointSize = 3.0; /// 4.0
c = isB;
}`,
frag: `
precision mediump float;
varying float c;
void main() {
vec4 blue = vec4(0.00, 0.65, 1.00, 1);
// vec4 orng = vec4(0.99, 0.45, 0.011, 1);
vec4 orng = vec4(1.0, 0.8, 0.2, 1);
gl_FragColor = c == 1.0 ? blue : orng;
}`,
attributes: {
speed: { buffer: regl.buffer(data.map((d) => d.speed)) },
x: { buffer: data.map((d) => d.x) },
y0: { buffer: data.map((d) => d.y0) },
y1: { buffer: data.map((d) => d.y1) },
dy: { buffer: data.map((d) => d.dy) },
isB: { buffer: data.map((d) => d.isB) }
},
uniforms: {
interp: (ctx, props) => props.interp
},
primitive: "points",
count
});
regl.frame(({ time }) => {
regl.clear({
depth: 1,
color: [0.1, 0.1, 0.1, 1]
});
drawPoints({ interp: time / 40 });
});
}