//////////////////
// R = I-2(N・I)N
//////////////////
// ベクトルIを求める
"sub ft0, v0, fc18\n" + // fc18 == eye(0,0,-1)
// (N・I)を求める
"dp3 ft1, v1, ft0\n" +
// (N・I)・Nを求める
"mul ft1, ft1, v1\n" +
// -2(N・I)・Nを求める
"add ft1, ft1, ft1\n" +
"neg ft1, ft1\n" +
// R = I-2(N・I)・Nを求める
"add ft0, ft0, ft1\n" +
"nrm ft0.xyz, ft0.xyz\n" + // ft0 == 反射視線R
//////////////////
// ft5 == RGBA
//////////////////
"mov ft5, fc19\n" + // ft5 == 0 (初期化)
//----------------------------
// forward
//----------------------------
//////////////////
// uv値を求める
//////////////////
// vec q = cross(dir, e2)
"crs ft1.xyz, ft0.xyz, fc17.xyz\n" + // ft1 == q
// float s = dot(q, e1)
"dp3 ft2.xyz, ft1.xyz, fc16.xyz\n" + // ft2 == s
// vec3 e = org - p0
"sub ft3, v0, fc15\n" + // ft3 == e
// vec3 r = cross(e, e1)
"crs ft4.xyz, ft3.xyz, fc16.xyz\n" + // ft4 == r
// u = dot(q, e)/s
"dp3 ft1.x, ft1.xyz, ft3.xyz\n" +
"div ft1.x, ft1.x, ft2.x\n" +
// v = dot(r, dir)/s
"dp3 ft1.y, ft4.xyz, ft0.xyz\n" +
"div ft1.y, ft1.y, ft2.x\n" +
// t = dot(r, e2)/s
"dp3 ft1.z, ft4.xyz, fc17.xyz\n" +
"div ft1.z, ft1.z, ft2.x\n" +
//////////////////
// ft1.xyz == uvt
//////////////////
////////////////////////////////////////////
// if(u >= 0 && v >= 0 && w >= 0 && t >= 0)
////////////////////////////////////////////
// w = 2 - u - vを求める
"sub ft1.w, fc21.x, ft1.x\n" + // fc21 == 2
"sub ft1.w, ft1.w, ft1.y\n" +
"mov ft2.x, fc22.x\n" + // (初期化)fc22.x == 1.0 : ft2は1か0になる。ft2はカラーに掛ける。
////////////////////////////////////////////
// if(u >= 0)
////////////////////////////////////////////
"sge ft6.x, ft1.x, fc19.x\n" + // ft1.x >= fc19.x // fc19.x == 0.0
"mul ft2.x, ft2.x, ft6.x\n" +
////////////////////////////////////////////
// if(v >= 0)
////////////////////////////////////////////
"sge ft6.x, ft1.y, fc19.x\n" + // ft1.y >= fc19.x // fc19.x == 0.0
"mul ft2.x, ft2.x, ft6.x\n" +
////////////////////////////////////////////
// if(t >= 0)
////////////////////////////////////////////
"sge ft6.x, ft1.z, fc19.x\n" + // ft1.z >= fc19.x // fc19.x == 0.0
"mul ft2.x, ft2.x, ft6.x\n" +
////////////////////////////////////////////
// if(w >= 0)
////////////////////////////////////////////
"sge ft6.x, ft1.w, fc19.x\n" + // ft1.w >= fc19.x // fc19.x == 0.0
"mul ft2.x, ft2.x, ft6.x\n" +
////////////////////////////////////////////
// if(t < 1)
////////////////////////////////////////////
/*"slt ft6.x, ft1.z, fc22.x\n" + // ft1z < fc22.x // fc22.x == 1.0
"mul ft2.x, ft2.x, ft6.x\n" + */
////////////////////////////////////////////
// if(u < 1)
////////////////////////////////////////////
"slt ft6.x, ft1.x, fc22.x\n" + // ft1.x < fc22.x // fc22.x == 1.0
"mul ft2.x, ft2.x, ft6.x\n" +
////////////////////////////////////////////
// if(v < 1)
////////////////////////////////////////////
"slt ft6.x, ft1.y, fc22.x\n" + // ft1.y < fc22.x // fc22.x == 1.0
"mul ft2.x, ft2.x, ft6.x\n" +
"tex ft3, ft1.xy, fs0 <2d,norepeat,linear,nomip>\n" +
"mul ft3, ft3, ft2.xxxx\n" + // ft5 == RGBA
"add ft5, ft3, ft5\n" +
//----------------------------
// right
//----------------------------
//////////////////
// uv値を求める
//////////////////
// vec q = cross(dir, e2)
"crs ft1.xyz, ft0.xyz, fc5.xyz\n" + // ft1 == q
// float s = dot(q, e1)
"dp3 ft2.xyz, ft1.xyz, fc4.xyz\n" + // ft2 == s
// vec3 e = org - p0
"sub ft3, v0, fc3\n" + // ft3 == e
// vec3 r = cross(e, e1)
"crs ft4.xyz, ft3.xyz, fc4.xyz\n" + // ft4 == r
// u = dot(q, e)/s
"dp3 ft1.x, ft1.xyz, ft3.xyz\n" +
"div ft1.x, ft1.x, ft2.x\n" +
// v = dot(r, dir)/s
"dp3 ft1.y, ft4.xyz, ft0.xyz\n" +
"div ft1.y, ft1.y, ft2.x\n" +
// t = dot(r, e2)/s
"dp3 ft1.z, ft4.xyz, fc17.xyz\n" +
"div ft1.z, ft1.z, ft2.x\n" +
//////////////////
// ft1.xyz == uvt
//////////////////
////////////////////////////////////////////
// if(u >= 0 && v >= 0 && w >= 0 && t >= 0)
////////////////////////////////////////////
// w = 2 - u - vを求める
"sub ft1.w, fc21.x, ft1.x\n" + // fc21 == 2
"sub ft1.w, ft1.w, ft1.y\n" +
"mov ft2.x, fc22.x\n" + // (初期化)fc22.x == 1.0 : ft2は1か0になる。ft2はカラーに掛ける。
////////////////////////////////////////////
// if(u >= 0)
////////////////////////////////////////////
"sge ft6.x, ft1.x, fc19.x\n" + // ft1.x >= fc19.x // fc19.x == 0.0
"mul ft2.x, ft2.x, ft6.x\n" +
////////////////////////////////////////////
// if(v >= 0)
////////////////////////////////////////////
"sge ft6.x, ft1.y, fc19.x\n" + // ft1.y >= fc19.x // fc19.x == 0.0
"mul ft2.x, ft2.x, ft6.x\n" +
////////////////////////////////////////////
// if(t >= 0)
////////////////////////////////////////////
"sge ft6.x, ft1.z, fc19.x\n" + // ft1.z >= fc19.x // fc19.x == 0.0
"mul ft2.x, ft2.x, ft6.x\n" +
////////////////////////////////////////////
// if(w >= 0)
////////////////////////////////////////////
"sge ft6.x, ft1.w, fc19.x\n" + // ft1.w >= fc19.x // fc19.x == 0.0
"mul ft2.x, ft2.x, ft6.x\n" +
////////////////////////////////////////////
// if(t < 1)
////////////////////////////////////////////
/*"slt ft6.x, ft1.z, fc22.x\n" + // ft1z < fc22.x // fc22.x == 1.0
"mul ft2.x, ft2.x, ft6.x\n" + */
////////////////////////////////////////////
// if(u < 1)
////////////////////////////////////////////
"slt ft6.x, ft1.x, fc22.x\n" + // ft1.x < fc22.x // fc22.x == 1.0
"mul ft2.x, ft2.x, ft6.x\n" +
////////////////////////////////////////////
// if(v < 1)
////////////////////////////////////////////
"slt ft6.x, ft1.y, fc22.x\n" + // ft1.y < fc22.x // fc22.x == 1.0
"mul ft2.x, ft2.x, ft6.x\n" +
"tex ft3, ft1.xy, fs1 <2d,norepeat,linear,nomip>\n" +
"mul ft3, ft3, ft2.xxxx\n" + // ft5 == RGBA
"add ft5, ft3, ft5\n" +
//----------------------------
// left
//----------------------------
//////////////////
// uv値を求める
//////////////////
// vec q = cross(dir, e2)
"crs ft1.xyz, ft0.xyz, fc2.xyz\n" + // ft1 == q
// float s = dot(q, e1)
"dp3 ft2.xyz, ft1.xyz, fc1.xyz\n" + // ft2 == s
// vec3 e = org - p0
"sub ft3, v0, fc0\n" + // ft3 == e
// vec3 r = cross(e, e1)
"crs ft4.xyz, ft3.xyz, fc1.xyz\n" + // ft4 == r
// u = dot(q, e)/s
"dp3 ft1.x, ft1.xyz, ft3.xyz\n" +
"div ft1.x, ft1.x, ft2.x\n" +
// v = dot(r, dir)/s
"dp3 ft1.y, ft4.xyz, ft0.xyz\n" +
"div ft1.y, ft1.y, ft2.x\n" +
// t = dot(r, e2)/s
"dp3 ft1.z, ft4.xyz, fc17.xyz\n" +
"div ft1.z, ft1.z, ft2.x\n" +
//////////////////
// ft1.xyz == uvt
//////////////////
////////////////////////////////////////////
// if(u >= 0 && v >= 0 && w >= 0 && t >= 0)
////////////////////////////////////////////
// w = 2 - u - vを求める
"sub ft1.w, fc21.x, ft1.x\n" + // fc21 == 2
"sub ft1.w, ft1.w, ft1.y\n" +
"mov ft2.x, fc22.x\n" + // (初期化)fc22.x == 1.0 : ft2は1か0になる。ft2はカラーに掛ける。
////////////////////////////////////////////
// if(u >= 0)
////////////////////////////////////////////
"sge ft6.x, ft1.x, fc19.x\n" + // ft1.x >= fc19.x // fc19.x == 0.0
"mul ft2.x, ft2.x, ft6.x\n" +
////////////////////////////////////////////
// if(v >= 0)
////////////////////////////////////////////
"sge ft6.x, ft1.y, fc19.x\n" + // ft1.y >= fc19.x // fc19.x == 0.0
"mul ft2.x, ft2.x, ft6.x\n" +
////////////////////////////////////////////
// if(t >= 0)
////////////////////////////////////////////
"sge ft6.x, ft1.z, fc19.x\n" + // ft1.z >= fc19.x // fc19.x == 0.0
"mul ft2.x, ft2.x, ft6.x\n" +
////////////////////////////////////////////
// if(w >= 0)
////////////////////////////////////////////
"sge ft6.x, ft1.w, fc19.x\n" + // ft1.w >= fc19.x // fc19.x == 0.0
"mul ft2.x, ft2.x, ft6.x\n" +
////////////////////////////////////////////
// if(t < 1)
////////////////////////////////////////////
/*"slt ft6.x, ft1.z, fc22.x\n" + // ft1z < fc22.x // fc22.x == 1.0
"mul ft2.x, ft2.x, ft6.x\n" + */
////////////////////////////////////////////
// if(u < 1)
////////////////////////////////////////////
"slt ft6.x, ft1.x, fc22.x\n" + // ft1.x < fc22.x // fc22.x == 1.0
"mul ft2.x, ft2.x, ft6.x\n" +
////////////////////////////////////////////
// if(v < 1)
////////////////////////////////////////////
"slt ft6.x, ft1.y, fc22.x\n" + // ft1.y < fc22.x // fc22.x == 1.0
"mul ft2.x, ft2.x, ft6.x\n" +
"tex ft3, ft1.xy, fs2 <2d,norepeat,linear,nomip>\n" +
"mul ft3, ft3, ft2.xxxx\n" + // ft5 == RGBA
"add ft5, ft3, ft5\n" +
//////////////////
// final
//////////////////
"mov oc, ft5"