Example #1
0
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);
    }
}
Example #2
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));
}
Example #3
0
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);
}
Example #4
0
  		  (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]));
}