static void get_lum(double *col, t_scene *s, t_intersect *inter, int m) { t_vec3 l; t_vec3 r; double ln; int i; double is; double id; double dist; double rv; double tmp; t_ray ray; t_intersect shadow; i = -1; if (s->lights[m].light.type == DIRECTIONNAL) { while (++i < 3) { ln = dot_vec3(inter->norm, s->lights[m].light.dir); col[i] = MAX(ln, 0) * s->lights[m].light.color.argb[i] / 255.0 * s->lights[m].light.power; } return ; } l = sub_vec3(s->lights[m].pos, inter->pos); dist = vec3_len(l); l = div_vec3(l, dist); dist -= s->lights[m].light.radius; ln = dot_vec3(l, inter->norm); ln = MAX(ln, 0.0); r = vec3_normalize(sub_vec3(mult_vec3(inter->norm, 2 * ln), l)); is = s->lights[m].light.power / dist; id = s->lights[m].light.radius * is; rv = -dot_vec3(r, inter->dir); rv = MAX(rv, 0.0); ray.pos = add_vec3(inter->pos, mult_vec3(inter->norm, 0.00001)); ray.dir = l; ray.env = NULL; scene_intersect(s, &ray, &shadow); if (shadow.dist < dist - 0.0001) return ; while (++i < 3) { tmp = inter->mat->diffuse * MAX(ln, 0) * id * s->lights[m].light.color.argb[i] / 255.0; col[i] += MAX(tmp, 0); tmp = inter->mat->specular * pow(rv, inter->mat->shininess) * is * s->lights[m].light.color.argb[i] / 255.0; col[i] += MAX(tmp, 0); } }
t_vec3 hsv2rgb_smooth(t_vec3 c) { t_vec3 rgb; rgb.x = CLAMP(fabs(fmod(c.x * 6.0, 6.0) - 3.0) - 1.0, 0.0, 1.0); rgb.y = CLAMP(fabs(fmod(c.x * 6.0 + 4.0, 6.0) - 3.0) - 1.0, 0.0, 1.0); rgb.z = CLAMP(fabs(fmod(c.x * 6.0 + 2.0, 6.0) - 3.0) - 1.0, 0.0, 1.0); rgb = mul_vec3(mul_vec3(rgb, rgb), sub_vec3(vec3_1(3), mul_vec3_1(rgb, 2))); return (mul_vec3_1(mix_vec3_1(vec3_1(1), rgb, c.y), c.z)); }
t_intersect get_intersect_tore(t_obj *obj, t_ray *ray) { t_intersect inter; t_vec3 u; inter.dir = ray->dir; inter.mat = obj->mat; if (!check_box(obj, ray)) return (inter); get_dist_tore(ray, &inter, obj); if (inter.dist < 0.0 || inter.dist == NOT_A_SOLUTION) { inter.dist = -1.0; return (inter); } inter.pos = add_vec3(mult_vec3(ray->dir, inter.dist), ray->pos); u = sub_vec3(inter.pos, obj->pos); u.z = 0.0; u = mult_vec3(vec3_normalize(u), obj->torus.radius_hole); u = add_vec3(u, obj->pos); inter.norm = vec3_normalize(sub_vec3(inter.pos, u)); return (inter); }
(inter.pos.y - ori->y)) / d[0].z + ori->z; calc_tmp_normal(&tmp, &inter); d[1].x = calc_x(&inter, tmp); d[1].y = calc_y(&inter, tmp); d[1].z = calc_z(&inter, tmp); update_inter_normal(&inter, ori, -0.000000001, -0.000000002); inter.pos.z = -(d[0].x * (inter.pos.x - ori->x) + d[0].y * (inter.pos.y - ori->y)) / d[0].z + ori->z; calc_tmp_normal(&tmp, &inter); d[2].x = calc_x(&inter, tmp); d[2].y = calc_y(&inter, tmp); d[2].z = calc_z(&inter, tmp); } void calc_normale(double (*calc_x)(), double (*calc_y)(), double (*calc_z)(), t_intersect *inter) { t_vec3 d[3]; t_vec3 v[2]; t_vec3 tmp; calc_tmp_normal(&tmp, inter); d[0].x = calc_x(inter, tmp); d[0].y = calc_y(inter, tmp); d[0].z = calc_z(inter, tmp); calc_new_pts_normal(calc_x, calc_y, calc_z, (t_vec3*[2]){d, &inter->pos}); v[0] = sub_vec3(d[1], d[0]); v[1] = sub_vec3(d[2], d[0]); inter->norm = vec3_normalize(cross_vec3(v[0], v[1])); }