double get_specular_coef(t_lco *lpt, double *cam_pos) { double lvec[3]; double cvec[3]; double rvec[3]; double scal[2]; copy_tab(lpt->lvec, lvec, 3); cvec[0] = cam_pos[0] - lpt->obj_coor[0]; cvec[1] = cam_pos[1] - lpt->obj_coor[1]; cvec[2] = cam_pos[2] - lpt->obj_coor[2]; unitaire(lvec); unitaire(lpt->nvec); scal[0] = scale(lvec, lpt->nvec); rvec[0] = lvec[0] - 2.0 * scal[0] * lpt->nvec[0]; rvec[1] = lvec[1] - 2.0 * scal[0] * lpt->nvec[1]; rvec[2] = lvec[2] - 2.0 * scal[0] * lpt->nvec[2]; scal[1] = scale(rvec, cvec); if (scal[1] < 0) scal[1] += 360; if (scal[1] < 90) return (ABS(pow(cos_vector(rvec, cvec), 15))); return (0); }
int texture(t_vector3 eye, t_vector3 cam, t_best best) { unsigned int color; int c; double v; double u; double pos; translate(&eye, best.obj.p, 1); rot_inv(&eye, best.obj.r); rot_inv(&cam, best.obj.r); scale(&(cam), best.obj.s); best.normal = unitaire(get_normal(cam, eye, best)); u = (int)(best.obj.tex.w * (0.5 + atan2(best.normal.z, best.normal.x) / (2 * M_PI))); v = (int)(best.obj.tex.h * (0.5 - asin(best.normal.y) / M_PI)); pos = 4 * u + 4 * v * best.obj.tex.w; c = (int)pos; color = 0; color += best.obj.tex.texture.data[c++] << 8; color += best.obj.tex.texture.data[c++] << 16; color += best.obj.tex.texture.data[c++] << 24; return (color); }