95 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
| /* ************************************************************************** */
 | |
| /*                                                                            */
 | |
| /*                                                        :::      ::::::::   */
 | |
| /*   maths_obj_prism.c                                  :+:      :+:    :+:   */
 | |
| /*                                                    +:+ +:+         +:+     */
 | |
| /*   By: ntrahy <marvin@42.fr>                      +#+  +:+       +#+        */
 | |
| /*                                                +#+#+#+#+#+   +#+           */
 | |
| /*   Created: 2017/01/03 00:45:11 by ntrahy            #+#    #+#             */
 | |
| /*   Updated: 2017/01/09 14:22:37 by scebula          ###   ########.fr       */
 | |
| /*                                                                            */
 | |
| /* ************************************************************************** */
 | |
| 
 | |
| #include "rt.h"
 | |
| 
 | |
| static void			init_prism_distance(double distance[4][3])
 | |
| {
 | |
| 	distance[0][0] = 0;
 | |
| 	distance[0][1] = 0;
 | |
| 	distance[0][2] = 0;
 | |
| 	distance[1][0] = 0;
 | |
| 	distance[1][1] = 0;
 | |
| 	distance[1][2] = 0;
 | |
| 	distance[2][0] = 0;
 | |
| 	distance[2][1] = 0;
 | |
| 	distance[2][2] = 0;
 | |
| 	distance[3][0] = 0;
 | |
| 	distance[3][1] = 0;
 | |
| 	distance[3][2] = 0;
 | |
| }
 | |
| 
 | |
| static void			find_second_prism_n(double distance[12][3],
 | |
| 	double *dist, int winning_i, double first_distance)
 | |
| {
 | |
| 	int		i;
 | |
| 	double	tmp;
 | |
| 
 | |
| 	i = -1;
 | |
| 	tmp = 0;
 | |
| 	dist[2] = first_distance;
 | |
| 	dist[0] = dist[2];
 | |
| 	dist[1] = dist[2];
 | |
| 	while (++i < 4)
 | |
| 	{
 | |
| 		if (i != winning_i)
 | |
| 		{
 | |
| 			if (distance[i][2] != 0)
 | |
| 				tmp = distance[i][2];
 | |
| 		}
 | |
| 	}
 | |
| 	if (tmp < dist[2])
 | |
| 		dist[0] = tmp;
 | |
| 	else
 | |
| 		dist[1] = tmp;
 | |
| }
 | |
| 
 | |
| static void			save_closest_triangle_prism(t_obj *obj, t_thread *thread,
 | |
| 		int *i, int *winning_i)
 | |
| {
 | |
| 	if (thread)
 | |
| 		TO_PRISM->closest_triangle[thread->num] = *i;
 | |
| 	else
 | |
| 		TO_PRISM->closest_triangle[0] = *i;
 | |
| 	*winning_i = *i;
 | |
| }
 | |
| 
 | |
| void				get_prism_n(t_ray ray, t_obj *obj,
 | |
| 		t_thread *thread, double *dist)
 | |
| {
 | |
| 	double	distance[4][3];
 | |
| 	double	tmp;
 | |
| 	int		i;
 | |
| 	int		winning_i;
 | |
| 
 | |
| 	init_prism_distance(distance);
 | |
| 	i = -1;
 | |
| 	while (++i < 4)
 | |
| 		get_triangle_n(ray, TO_PRISM->triangle[i], thread, distance[i]);
 | |
| 	if (thread)
 | |
| 		TO_PRISM->closest_triangle[thread->num] = -1;
 | |
| 	else
 | |
| 		TO_PRISM->closest_triangle[0] = -1;
 | |
| 	tmp = 0;
 | |
| 	i = -1;
 | |
| 	while (++i < 4)
 | |
| 	{
 | |
| 		if ((tmp < distance[i][2] && tmp == 0 && distance[i][2] > ACC) ||
 | |
| 				(distance[i][2] < tmp && tmp != 0 && distance[i][2] > ACC))
 | |
| 		{
 | |
| 			tmp = distance[i][2];
 | |
| 			save_closest_triangle_prism(obj, thread, &i, &winning_i);
 | |
| 		}
 | |
| 	}
 | |
| 	find_second_prism_n(distance, dist, winning_i, tmp);
 | |
| }
 |