//-------------------------------------------------------------------------------------------------- public static void SupportEdge(Transform tx, Vec3 e, Vec3 n, out Vec3 aresult, out Vec3 bresult) { n = Transform.MulT(tx.rotation, n); Vec3 absN = Vec3.Abs(n); Vec3 a = new Vec3(), b = new Vec3(); // x > y if (absN.x > absN.y) { // x > y > z if (absN.y > absN.z) { a.Set(e.x, e.y, e.z); b.Set(e.x, e.y, -e.z); } // x > z > y || z > x > y else { a.Set(e.x, e.y, e.z); b.Set(e.x, -e.y, e.z); } } // y > x else { // y > x > z if (absN.x > absN.z) { a.Set(e.x, e.y, e.z); b.Set(e.x, e.y, -e.z); } // z > y > x || y > z > x else { a.Set(e.x, e.y, e.z); b.Set(-e.x, e.y, e.z); } } double signx = Sign(n.x); double signy = Sign(n.y); double signz = Sign(n.z); a.x *= signx; a.y *= signy; a.z *= signz; b.x *= signx; b.y *= signy; b.z *= signz; aresult = Transform.Mul(tx, a); bresult = Transform.Mul(tx, b); }
//-------------------------------------------------------------------------------------------------- public static void ComputeIncidentFace(Transform itx, Vec3 e, Vec3 n, ClipVertex[] result) { n = -Transform.MulT(itx.rotation, n); Vec3 absN = Vec3.Abs(n); if (absN.x > absN.y && absN.x > absN.z) { if (n.x > 0) { result[0].v.Set(e.x, e.y, -e.z); result[1].v.Set(e.x, e.y, e.z); result[2].v.Set(e.x, -e.y, e.z); result[3].v.Set(e.x, -e.y, -e.z); result[0].f.inI = 9; result[0].f.outI = 1; result[1].f.inI = 1; result[1].f.outI = 8; result[2].f.inI = 8; result[2].f.outI = 7; result[3].f.inI = 7; result[3].f.outI = 9; } else { result[0].v.Set(-e.x, -e.y, e.z); result[1].v.Set(-e.x, e.y, e.z); result[2].v.Set(-e.x, e.y, -e.z); result[3].v.Set(-e.x, -e.y, -e.z); result[0].f.inI = 5; result[0].f.outI = 11; result[1].f.inI = 11; result[1].f.outI = 3; result[2].f.inI = 3; result[2].f.outI = 10; result[3].f.inI = 10; result[3].f.outI = 5; } } else if (absN.y > absN.x && absN.y > absN.z) { if (n.y > 0) { result[0].v.Set(-e.x, e.y, e.z); result[1].v.Set(e.x, e.y, e.z); result[2].v.Set(e.x, e.y, -e.z); result[3].v.Set(-e.x, e.y, -e.z); result[0].f.inI = 3; result[0].f.outI = 0; result[1].f.inI = 0; result[1].f.outI = 1; result[2].f.inI = 1; result[2].f.outI = 2; result[3].f.inI = 2; result[3].f.outI = 3; } else { result[0].v.Set(e.x, -e.y, e.z); result[1].v.Set(-e.x, -e.y, e.z); result[2].v.Set(-e.x, -e.y, -e.z); result[3].v.Set(e.x, -e.y, -e.z); result[0].f.inI = 7; result[0].f.outI = 4; result[1].f.inI = 4; result[1].f.outI = 5; result[2].f.inI = 5; result[2].f.outI = 6; result[3].f.inI = 5; result[3].f.outI = 6; } } else { if (n.z > 0) { result[0].v.Set(-e.x, e.y, e.z); result[1].v.Set(-e.x, -e.y, e.z); result[2].v.Set(e.x, -e.y, e.z); result[3].v.Set(e.x, e.y, e.z); result[0].f.inI = 0; result[0].f.outI = 11; result[1].f.inI = 11; result[1].f.outI = 4; result[2].f.inI = 4; result[2].f.outI = 8; result[3].f.inI = 8; result[3].f.outI = 0; } else { result[0].v.Set(e.x, -e.y, -e.z); result[1].v.Set(-e.x, -e.y, -e.z); result[2].v.Set(-e.x, e.y, -e.z); result[3].v.Set(e.x, e.y, -e.z); result[0].f.inI = 9; result[0].f.outI = 6; result[1].f.inI = 6; result[1].f.outI = 10; result[2].f.inI = 10; result[2].f.outI = 2; result[3].f.inI = 2; result[3].f.outI = 9; } } for (int i = 0; i < 4; ++i) { result[i].v = Transform.Mul(itx, result[i].v); } }