!!ARBvp1.0

# Transform the position by the modelview/projection matrix, and that's it!

ATTRIB iPos          = vertex.position;
PARAM  mvp[4]        = { state.matrix.mvp };
PARAM  galaxyColor   = { 0, 1, 1, 0.3 };
PARAM  const         = { 0, 0.5, 1, 2 };
PARAM  eyePos        = program.env[1];
PARAM  semiAxes      = program.env[21];
PARAM  invSemiAxes   = program.env[22];
PARAM  factor        = program.env[23];
OUTPUT oPos          = result.position;
OUTPUT oColor        = result.color;

# Transform the vertex by the modelview matrix
DP4   oPos.x, mvp[0], iPos;
DP4   oPos.y, mvp[1], iPos;
DP4   oPos.z, mvp[2], iPos;
DP4   oPos.w, mvp[3], iPos;

TEMP  coeff;
TEMP  disc;
TEMP  t;
TEMP  dir;
TEMP  pos;

# input vertices currently pre-scaled, so this multiplication is unnecessary
#MUL   t, semiAxes, iPos;

MOV   t, iPos;
SUB   dir, t, eyePos;
MUL   pos, invSemiAxes, eyePos;
MUL   dir, invSemiAxes, dir;

# Compute coefficients of quadratic
DP3   coeff.x, dir, dir;
DP3   coeff.y, dir, pos;
DP3   coeff.z, pos, pos;
SUB   coeff.z, coeff.z, const.z;

# Solve the quadratic
# Compute discriminant: b*b - ac
MUL   disc.x, coeff.y, coeff.y;
MUL   t.x, coeff.x, coeff.z;
SUB   disc.x, disc.x, t.x;
# Clamp negative values to zero
MAX   disc.x, const.x, disc.x;
# Take the square root
POW   disc.x, disc.x, const.y;

RCP   t.x, coeff.x;
MUL   t.x, t.x, disc.x;
MUL   t.x, t.x, factor.x;
#MUL   t.x, t.x, const.w;

MUL   t.x, t.x, t.x;
MUL   t.x, t.x, t.x;
MUL   t.x, t.x, t.x;

# Output the texture
MOV   oColor, galaxyColor;
MUL   oColor.w, galaxyColor.w, t.x;

END
