/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   cub3d_structs.h                                    :+:      :+:    :+:   */
/*                                                    +:+ +:+         +:+     */
/*   By: rbousset <marvin@42.fr>                    +#+  +:+       +#+        */
/*                                                +#+#+#+#+#+   +#+           */
/*   Created: 2020/02/14 17:20:05 by rbousset          #+#    #+#             */
/*   Updated: 2020/02/14 17:20:06 by rbousset         ###   ########lyon.fr   */
/*                                                                            */
/* ************************************************************************** */

#	ifndef CUB3D_STRUCTS_H
#	define CUB3D_STRUCTS_H

#include <stddef.h>
#include <stdint.h>
#include <pthread.h>

typedef struct			s_win
{
	void				*wlx;
	void				*winptr;
	uint8_t				inited;
	uint16_t			x_max_size;
	uint16_t			y_max_size;
	uint32_t			x_size;
	uint32_t			y_size;
}						t_win;

#	pragma pack(push, 1)

typedef struct			s_bmp_file
{
	uint16_t			file_type;
	uint32_t			file_size;
	uint16_t			reserv_one;
	uint16_t			reserv_two;
	uint32_t			offset_data;
}						t_bmp_file;

typedef struct			s_bmp_info
{
	uint32_t			size;
	int32_t				width;
	int32_t				height;
	uint16_t			planes;
	uint16_t			bit_count;
	uint32_t			compression;
	uint32_t			size_image;
	int32_t				x_pixels_per_meter;
	int32_t				y_pixels_per_meter;
	uint32_t			colors_used;
	uint32_t			colors_important;
}						t_bmp_info;

typedef struct			s_bmp_rgb
{
	uint8_t				r;
	uint8_t				g;
	uint8_t				b;
}						t_bmp_rgb;

#	pragma pack(pop)

typedef struct			s_img
{
	void				*img;
	char				*ptr;
	int					bpp;
	int					sizeline;
	int					endian;
	int					img_w;
	int					img_h;
	int					tex_x;
	int					tex_y;
}						t_img;

typedef struct			s_rgb
{
	int16_t				r;
	int16_t				g;
	int16_t				b;
}						t_rgb;

typedef struct			s_sprite
{
	int32_t				s_screen_x;
	int32_t				s_pos_x;
	int32_t				s_pos_y;
	double				s_x;
	double				s_y;
	int32_t				s_h;
	int32_t				s_w;
	int32_t				s_start_x;
	int32_t				s_start_y;
	int32_t				s_end_x;
	int32_t				s_end_y;
	int32_t				s_tex_y;
	double				sprite_transform_x;
	double				sprite_transform_y;
	double				sprite_dist;
	double				inv_c_m;
}						t_sprite;

typedef struct			s_player
{
	float				pos_x;
	float				pos_y;
	float				start_x;
	float				start_y;
	float				dir_x;
	float				dir_y;
	float				cam_x;
	float				plane_x;
	float				plane_y;
}						t_player;

typedef struct			s_ray
{
	uint16_t			line_h;
	float				wall_dist;
	float				mid_dist;
	float				x_ray_pos;
	float				y_ray_pos;
	float				x_ray_dir;
	float				y_ray_dir;
	float				x_side_dist;
	float				y_side_dist;
	float				x_delta_dist;
	float				y_delta_dist;
	int16_t				wall_t;
	int16_t				wall_b;
	uint8_t				side;
	size_t				sqx;
	size_t				sqy;
	uint8_t				hit;
	double				wall_hit_x;
	double				step_tex_v;
}						t_ray;

typedef struct			s_map
{
	char				*filename;
	char				*no_tex_path;
	char				*so_tex_path;
	char				*ea_tex_path;
	char				*we_tex_path;
	char				*sprite_path;
	char				*nl_tex_path;
	char				*nlevel_path;
	char				*music_path;
	char				*music_cmd;
	char				*mapl;
	char				**map;
	int8_t				x_step;
	int8_t				y_step;
	size_t				map_w;
	size_t				map_h;
	size_t				mapl_len;
	size_t				line_chk;
	size_t				map_start;
	uint8_t				isspawn;
	uint8_t				isnlvl;
	uint8_t				ismusic;
	uint8_t				scale;
	uint32_t			nlx;
	uint32_t			nly;
}						t_map;

typedef struct			s_cub
{
	uint8_t				w_side;
	uint8_t				ishud;
	uint8_t				walltexgood;
	uint8_t				isoldmus;
	uint16_t			currlvl;
	uint16_t			i;
	char				errmsg[64];
	int32_t				key_input[5];
	pthread_t			tid;
	int					(*key_ptr[6])(struct s_cub*);
	int8_t				(*get_ptr[11])(char**, struct s_cub*);
	struct s_win		wlist;
	struct s_player		plist;
	struct s_map		mlist;
	struct s_ray		rlist;
	struct s_img		img;
	struct s_rgb		f_rgb;
	struct s_rgb		c_rgb;
	struct s_img		tlist[6];
	struct s_sprite		sp_list;
}						t_cub;

#	endif