//=========================================================================== void cLight::setDir(const cVector3d& a_direction) { // We arbitrarily point lights along the x axis of the stored // rotation matrix... this allows matrix transformations // to apply to lights. // m_localRot.setCol0(a_direction); cVector3d c0, c1, c2, t; a_direction.copyto(c0); // check vector if (c0.lengthsq() < 0.0001) { return; } // normalize direction vector c0.normalize(); // compute 2 vector perpendicular to a_direction t.set(a_direction.y, a_direction.z, a_direction.x); t.crossr(c0, c1); c1.crossr(c0, c2); // c0.negate(); c1.negate(); c2.negate(); // update rotation matrix m_localRot.setCol(c0,c1,c2); }
//=========================================================================== void cDirectionalLight::setDir(const cVector3d& a_direction) { // We arbitrarily point lights along the x axis of the stored // rotation matrix... this allows matrix transformations // to apply to lights. // m_localRot.setCol0(a_direction); cVector3d c0, c1, c2, t0, t1; a_direction.copyto(c0); // check vector if (c0.lengthsq() < 0.0001) { return; } // normalize direction vector c0.normalize(); // compute 2 vector perpendicular to a_direction t0.set(0.0, 0.0, 1.0); t1.set(0.0, 1.0, 0.0); double a0 = cAngle(c0, t0); double a1 = cAngle(c0, t1); if (sin(a0) > sin(a1)) { c0.crossr(t0, c1); c0.crossr(c1, c2); } else { c0.crossr(t1, c1); c0.crossr(c1, c2); } c1.normalize(); c2.normalize(); // update rotation matrix m_localRot.setCol(c0,c1,c2); }