89 lines
2.9 KiB
JavaScript
89 lines
2.9 KiB
JavaScript
// 3D Audio-Waves -> maybe also 2D?
|
|
class Wave extends Visual {
|
|
constructor() {
|
|
super();
|
|
this.name = "3D Wave";
|
|
}
|
|
|
|
updateData() {
|
|
let data = audioHandler.getFloatArray();
|
|
let add = 2 / data.length,
|
|
x = -1;
|
|
let outerLoop = 0;
|
|
for (let i = 0; i < data.length; i++) {
|
|
//first
|
|
this.data[outerLoop] = x;
|
|
this.data[outerLoop + 1] = data[i];
|
|
this.data[outerLoop + 2] = 0;
|
|
//second
|
|
this.data[outerLoop + 3] = x;
|
|
//third
|
|
this.data[outerLoop + 6] = x;
|
|
this.data[outerLoop + 8] = data[i + 1] || 0;
|
|
outerLoop += 9;
|
|
x += add;
|
|
}
|
|
}
|
|
|
|
draw(program) {
|
|
this.prepare(program);
|
|
let position = this.position,
|
|
positionBuffer = gl.createBuffer();
|
|
this.rotate(program);
|
|
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
|
|
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(this.data), gl.DYNAMIC_DRAW);
|
|
let vao = gl.createVertexArray();
|
|
gl.bindVertexArray(vao);
|
|
gl.enableVertexAttribArray(position);
|
|
gl.vertexAttribPointer(position, 3, gl.FLOAT, true, 0, 0);
|
|
gl.drawArrays(vConf.get("waveForm", gl.TRIANGLES), 0, this.data.length / 3);
|
|
this.afterDraw();
|
|
}
|
|
|
|
rotate(program) {
|
|
let aspect = c.width / c.height,
|
|
matrix = [
|
|
1 / aspect, 0, 0, 0,
|
|
0, 0.6, 0, 0,
|
|
0, 0, 1, 0,
|
|
0, 0, 0, 1
|
|
]
|
|
matrix = TDUtils.multiply(matrix, TDUtils.xRotation(vConf.get("rotation-x", 10)));
|
|
matrix = TDUtils.multiply(matrix, TDUtils.yRotation(vConf.get("rotation-y", 50)));
|
|
matrix = TDUtils.multiply(matrix, TDUtils.zRotation(vConf.get("rotation-z", -30)));
|
|
let rotate = gl.getUniformLocation(program, "u_matrix");
|
|
gl.uniformMatrix4fv(rotate, false, matrix);
|
|
}
|
|
|
|
setup() {
|
|
this.updateFFT(vConf.get('fftSize', 4096));
|
|
vConf.get("rotation-z", -30);
|
|
vConf.get("rotation-y", 50);
|
|
vConf.get("rotation-x", 10);
|
|
}
|
|
|
|
updateFFT(fftSize) {
|
|
audioHandler.fftSize(fftSize);
|
|
this.data = new Float32Array(fftSize * 9);
|
|
}
|
|
|
|
prepare(program) {
|
|
this.position = gl.getAttribLocation(program, "a_position");
|
|
this.color = gl.getUniformLocation(program, "u_color");
|
|
let lightPos = gl.getUniformLocation(program, "u_lightPos"),
|
|
light = gl.getUniformLocation(program, "u_light");
|
|
gl.uniform3fv(lightPos, [
|
|
vConf.get("light-x", 0),
|
|
vConf.get("light-y", 5),
|
|
vConf.get("light-z", -56)
|
|
]);
|
|
gl.uniform1f(light, parseFloat(vConf.get("light-strength", 0.3)));
|
|
}
|
|
|
|
afterDraw() {
|
|
TDUtils.updateRotate('rotation-x', 10);
|
|
TDUtils.updateRotate('rotation-y', 50);
|
|
TDUtils.updateRotate('rotation-z', -30);
|
|
vConf.save();
|
|
}
|
|
} |