Exemplo n.º 1
0
size_t			lst_index_of(t_lst *l, void *data)
{
	t_lstiter	it;

	init_iter(&it, l, increasing);
	while (lst_iterator_next(&it))
	{
		if (it.data == data)
			return (it.pos);
	}
	return (LST_NOINDEX);
}
Exemplo n.º 2
0
t_material		*get_material(const t_scene *scene, const char *name)
{
	t_lstiter	it;
	t_material	*material;

	init_iter(&it, scene->materials, increasing);
	while (lst_iterator_next(&it))
	{
		material = (t_material*)it.data;

		if (ft_strequ(material->name, name))
			return (material);
	}

	return (NULL);
}
Exemplo n.º 3
0
static void	raycast_light(t_hit *hit, unsigned depth)
{
	t_lstiter	it;
	t_ray		ray;
	t_light		*light;
	int			raycast_result;
	t_vec3		lightness;
	t_hit		sub_hit;

	if (depth == 0)
		return ;

	vec3_set(&lightness, 0, 0, 0);
	init_iter(&it, rt.scene->lights, increasing);
	while (lst_iterator_next(&it))
	{
		light = (t_light*)it.data;
		vec3_copy(&ray.origin, &hit->position);
		vec3_copy(&ray.direction, &light->position);
		vec3_sub(&ray.direction, &hit->position);
		vec3_normalize(&ray.direction);

		ray.origin.x += ray.direction.x * RC_SHADOW_SHIFT;
		ray.origin.y += ray.direction.y * RC_SHADOW_SHIFT;
		ray.origin.z += ray.direction.z * RC_SHADOW_SHIFT;

		raycast_result = raycast(&ray, &sub_hit, depth - 1, NULL);

		if (sub_hit.object != NULL)
		{
			// ray bounce
		}
		else
		{
			vec3_add(&lightness, &light->color);
		}
	}

	vec3_div(&lightness, rt.scene->lights->size);
	vec3_add(&lightness, &rt.scene->ambient_light);
	color_clamp(&lightness);

	hit->color.x *= lightness.x;
	hit->color.y *= lightness.y;
	hit->color.z *= lightness.z;
}
Exemplo n.º 4
0
void		*lst_remove_iterator_node(t_lstiter *it)
{
	void	*data;
	size_t	pos;
	t_node	*node;

	node = it->current;
	pos = it->pos;
	lst_iterator_next(it);
	it->flag = 2;
	data = lst_remove(it->lst, pos);
	if (node == it->end)
		init_iter(it, it->lst, it->dir);
	else
		it->pos = pos;
	return (data);
}
Exemplo n.º 5
0
int		raycast(const t_ray *ray, t_hit *hit, unsigned depth, t_object *exclude)
{
	t_lstiter	it;
	int			raycast_result;
	t_hit		closest_hit;
	t_object	*object;

	hit_reset(hit);

	if (depth == 0)
		return (0);

	hit_reset(&closest_hit);
	init_iter(&it, rt.scene->objects, increasing);
	while (lst_iterator_next(&it))
	{
		object = (t_object*)it.data;

		if (object == exclude)
			continue ;

		raycast_result = raycast_to_object(hit, ray, object);

		if (raycast_result)
		{
			if (closest_hit.object == NULL || closest_hit.distance > hit->distance)
				hit_copy(&closest_hit, hit);
		}
	}

	hit_copy(hit, &closest_hit);

	if (closest_hit.object == NULL)
	{
		return (0);
	}
	else
	{
		raycast_light(hit, depth);
		return (1);
	}
}