/**
* Copyright ohisama ( http://wonderfl.net/user/ohisama )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/f2xZ
*/
// forked from macrobin's forked from: forked from: forked from: spectrum - spiral
// forked from hellohello's forked from: forked from: spectrum - spiral
// forked from hacker_47ryxtat's forked from: spectrum - spiral
// forked from k__'s spectrum - spiral
/*
this code is originally written to be used as a music visualizer used with Sound.computeSpectrum()
*/
package
{
import flash.display.*;
import flash.events.*;
import flash.text.*;
import flash.geom.*;
import flash.filters.*;
public class Main extends Sprite
{
private var canvas : BitmapData;
private var canvasRect : Rectangle;
private var oPt : Point;
private var cMtx : ColorMatrixFilter;
private var blur : BlurFilter;
private var shape : Shape;
private var cx : Number, cy : Number;
private var verts : Vector.<Number>;
private var pVerts : Vector.<Number>;
private var uvts : Vector.<Number>;
private var pmtx : Matrix3D;
private var pers : PerspectiveProjection;
private var angles : Vector.<Number>;
private var vPos : Vector.<Number>;
private var levs : Vector.<Number>;
private var xr : Number = 0, yr : Number = 0;
private var cnt : uint = 0;
private var waves : Array;
private var numWaves : uint = 5;
private const WAVE_HEIGHT : Number = 50;
private const BASE_RADIUS : Number = 80;
public function Main()
{
angles = new Vector.<Number>();
vPos = new Vector.<Number>();
levs = new Vector.<Number>();
var n : Number = 0;
var freq : Number;
for (var i : uint = 0; i < 3000; i ++)
{
freq = 55 * Math.pow(2, i / 120);
if (freq > n * 14080 / 163.5)
{
angles.push(Math.PI * 2 * i / 120);
vPos.push(-(angles[n] * 6 - 265));
n ++;
}
if (n >= 256)
{
break;
}
}
for (i = 0; i < 256; i ++)
{
levs.push(0);
}
shape = new Shape();
addChild(new Bitmap(canvas = new BitmapData(stage.stageWidth,stage.stageHeight,true,0xff000000)));
canvasRect = canvas.rect;
oPt = new Point(0, 0);
cMtx = new ColorMatrixFilter([0.99, 0, 0, 0, 0, 0, 0.99, 0, 0, 0, 0, 0, 0.99, 0, 0, 0, 0, 0, 1, 0]);
blur = new BlurFilter(2, 2);
cx = stage.stageWidth / 2;
cy = stage.stageHeight / 2;
pVerts = new Vector.<Number>();
pmtx = new Matrix3D();
pers = new PerspectiveProjection();
uvts = new Vector.<Number>();
addEventListener(Event.ENTER_FRAME, h_enterFrame);
initWaves();
}
private function initWaves() : void
{
waves = new Array();
for (var i : uint = 0; i < numWaves; i ++)
{
waves.push(Math.random());
}
}
private function h_enterFrame(evt : Event) : void
{
var i : uint, j : uint;
var lev : Number;
verts = new Vector.<Number>;
if (Math.random() < 0.01)
{
initWaves();
}
for (i = 0; i < 256; i ++)
{
lev = 0;
for (j = 0; j < numWaves; j ++)
{
lev += Math.sin((cnt + i) * waves[j] / 10);
}
lev = lev / numWaves * (1 + i / 128);
if (!levs[i])
{
levs[i] = 0;
}
if (lev > levs[i])
{
levs[i] = (lev + levs[i]) / 2;
}
else
{
levs[i] *= 0.9;
}
verts.push(Math.cos(angles[i]) * (levs[i] * WAVE_HEIGHT + BASE_RADIUS));
verts.push(vPos[i]);
verts.push(Math.sin(angles[i]) * (levs[i] * WAVE_HEIGHT + BASE_RADIUS));
}
var gr : Graphics = shape.graphics;
gr.clear();
pers.fieldOfView = 100;
pmtx.identity();
yr -= Math.sin(cnt / 200);
xr += 0.5;
pmtx.appendRotation(xr, Vector3D.X_AXIS);
pmtx.appendRotation(yr, Vector3D.Y_AXIS);
pmtx.appendTranslation(0, 0, pers.focalLength);
pmtx.append(pers.toMatrix3D());
bugfix(pmtx);
Utils3D.projectVectors(pmtx, verts, pVerts, uvts);
cnt = (cnt + 1) % (256 * 10);
for (i = 20; i < 254; i ++)
{
var r : uint = (cnt + i) % 256;
var g : uint = (cnt + i + 12) % 256;
var b : uint = (cnt+ i + 32) % 256;
gr.lineStyle(0,r << 16 | g << 8 | b);
if (i == 20)
{
gr.moveTo(pVerts[i * 2] + cx, pVerts[i * 2 + 1] + cy);
}
else
{
gr.curveTo(pVerts[i * 2] + cx, pVerts[i * 2 + 1] + cy, (pVerts[i * 2] + pVerts[i * 2 + 2]) / 2 + cx, (pVerts[i * 2 + 1] + pVerts[i * 2 + 3]) / 2 + cy);
}
}
canvas.draw(shape, null, null, BlendMode.ADD);
canvas.applyFilter(canvas,canvasRect,oPt,cMtx);
canvas.applyFilter(canvas,canvasRect,oPt,blur);
}
private function bugfix(matrix : Matrix3D) : void
{
var m1 : Matrix3D = new Matrix3D(Vector.<Number>([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 ]));
var m2 : Matrix3D = new Matrix3D(Vector.<Number>([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 ]));
m1.append(m2);
if (m1.rawData[15] == 20)
{
var rawData : Vector.<Number> = matrix.rawData;
rawData[15] /= 20;
matrix.rawData = rawData;
}
}
}
}