Projective Texture Mapping as a Light Source

    public Light(float px, float py, float pz, float lx, float ly, float lz,
                 float upx, float upy, float upz, float hfov, Raster r) {
        lightType = SHADER;
        float t, ux, uy, uz, vx, vy, vz;

        x = px;   y = py;   z = pz;
        ir = 0;   ig = 0;   ib = 0;

        lx = lx - x;  ly = ly - y;  lz = lz - z;
        t = (float)(1 / Math.sqrt(lx*lx + ly*ly + lz*lz));
        lx *= t;  ly *= t; lz *= t;

        ux = ly*upz - lz*upy;  uy = lz*upx - lx*upz;  uz = lx*upy - ly*upx;
        t = (float)(1 / Math.sqrt(ux*ux + uy*uy + uz*uz));
        ux *= t;   uy *= t;   uz *= t;

        vx = ly*uz - lz*uy;  vy = lz*ux - lx*uz;  vz = lx*uy - ly*ux;
        t = (float)(1 / Math.sqrt(vx*vx + vy*vy + vz*vz));
        vx *= t;  vy *= t;  vz *= t;

        t = (float)(1 / (2*Math.tan((0.5*hfov)*Math.PI/180)));
        lx = lx*t - 0.5f*(ux + vx);
        ly = ly*t - 0.5f*(uy + vy);
        lz = lz*t - 0.5f*(uz + vz);

        setProjective(lx, ly, lz, ux, uy, uz, vx, vy, vz);  // Inverts matrix
        lightTexture = r;
    }
    
Lecture 20   Slide 7   6.837 Fall '00