//
import java.awt.*; import render.*; public class misc { static public void transform(double xyz[], Matrix m) { double x = xyz[0], y = xyz[1], z = xyz[2]; xyz[0] = m.get(0,0) * x + m.get(0,1) * y + m.get(0,2) * z + m.get(0,3); xyz[1] = m.get(1,0) * x + m.get(1,1) * y + m.get(1,2) * z + m.get(1,3); xyz[2] = m.get(2,0) * x + m.get(2,1) * y + m.get(2,2) * z + m.get(2,3); } static public void aimXY(Matrix m, double X[], double Y[]) { double Z[] = {0,0,0}; Vec.normalize(X); set(m, 0, X); Vec.cross(Y,X,Z); Vec.normalize(Z); set(m, 2, Z); Vec.cross(X,Z,Y); Vec.normalize(Y); set(m, 1, Y); } static public void set(Matrix m, int col, double V[]) { m.set(0,col, V[0]); m.set(1,col, V[1]); m.set(2,col, V[2]); } static public double lerp(double t, double a, double b) { return a + t * (b - a); } static public double clip(double t, double lo, double hi) { return Math.max(lo, Math.min(hi, t)); } static double spline(double S[], double t) { if (t < 0) return S[1]; for (int i = 0 ; i < S.length-2 ; i += 2) if (t >= S[i] && t < S[i+2]) return lerp((t - S[i]) / (S[i+2] - S[i]), S[i+1], S[i+3]); return S[S.length-1]; } static public double bias(double a, double b) { if (a < .001) return 0.; else if (a > .999) return 1.; else if (b < .001) return 0.; else if (b > .999) return 1.; else return Math.pow(a, Math.log(b) / LOG_HALF); } static public double gain(double a, double b) { double p; if (a<.001) return 0.; else if (a>.999) return 1; b = (b<.001) ? .0001 : (b>.999) ? .999 : b; p = Math.log(1. - b) / LOG_HALF; if (a < 0.5) return Math.pow(2 * a, p) / 2; else return 1. - Math.pow(2 * (1. - a), p) / 2; } static private final double LOG_HALF = Math.log(0.5); static int stringWidth(String s, Graphics g) { return g.getFontMetrics(g.getFont()).stringWidth(s); } }