diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ab46ec6 --- /dev/null +++ b/Makefile @@ -0,0 +1,209 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# Makefile :+: :+: :+: # +# +:+ +:+ +:+ # +# By: scebula +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2017/01/09 20:49:49 by scebula #+# #+# # +# Updated: 2017/01/10 21:46:25 by scebula ### ########.fr # +# # +# **************************************************************************** # + +NAME = RT + +C_FILES = main.c \ + color_maths.c \ + color_tools.c \ + csg_diff.c \ + csg_inter.c \ + csg_add.c \ + display.c \ + display_names.c \ + display_scene_tmb.c \ + events_menu.c \ + events_scene.c \ + events_scene_look.c \ + events_scene_movement.c \ + events_scene_movement_up_down.c \ + free_functions.c \ + ft_error.c\ + get_obj_color.c \ + get_obj_color_bis.c \ + get_obj_normal.c \ + get_obj_normal_bis.c \ + get_obj_tf_list.c \ + get_obj_tf_list_complex.c \ + get_list_from_page.c \ + init_camera.c \ + init_env.c \ + init_cut_condition.c \ + init_function.c \ + init_img.c \ + init_light.c \ + init_obj_cone.c \ + init_obj_cube.c \ + init_obj_cylinder.c \ + init_obj_hyperboloid.c \ + init_obj_paraboloid.c \ + init_obj_plane.c \ + init_obj_prism.c \ + init_obj_sphere.c \ + init_obj_triangle.c \ + init_obj_triangle_bis.c \ + init_scenes.c \ + init_obj_csg.c \ + init_solid.c \ + init_vector.c \ + list_light_manage.c \ + list_obj_cone.c \ + list_obj_cube.c \ + list_obj_cylinder.c \ + list_obj_hyperboloid.c \ + list_obj_paraboloid.c \ + list_obj_plane.c \ + list_obj_prism.c \ + list_obj_sphere.c \ + list_obj_triangle.c \ + list_obj_csg.c \ + list_scene.c \ + maths_matrix.c \ + maths_matrix_rotation.c \ + maths_matrix_scale.c \ + maths_matrix_translation.c \ + maths_obj_cone.c \ + maths_obj_cube.c \ + maths_obj_cylinder.c \ + maths_obj_hyperboloid.c \ + maths_obj_paraboloid.c \ + maths_obj_plane.c \ + maths_obj_prism.c \ + maths_obj_sphere.c \ + maths_obj_triangle.c \ + maths_vector_calc.c \ + maths_vector_op.c \ + obj_apply_parameters.c\ + light_cam_apply_parameters.c\ + obj_apply_parameters_basic.c\ + obj_apply_parameters_complex.c\ + obj_parameter_parser.c\ + light_cam_populators.c\ + objects_populators_basic.c\ + objects_populators_complex.c\ + parameter_input_testers.c \ + parser.c\ + parser_check.c\ + parser_lexer.c \ + parser_line_identifier.c\ + post_pro_eblouissement.c \ + post_pro_hub.c \ + post_pro_img_anaglyph.c \ + post_pro_recolor.c \ + putpixel.c \ + init_ray.c \ + record_tools.c \ + rt_calculate_ray.c \ + rt_find_n.c \ + rt_get_color_at.c \ + rt_get_pixel_color.c \ + rt_raytracer.c \ + rt_reflection.c \ + rt_shadow.c \ + specular.c \ + texture_getter.c \ + texture_modifiers.c \ + texture_manager.c \ + tf_add.c \ + tf_apply.c \ + tf_free.c \ + tf_push.c \ + tools.c\ + events_select_scene.c \ + cut_object.c \ + cut_save.c \ + cut_select_negative.c \ + cut_select_positive.c \ + cut_select_special.c \ + cut_select_neg_or_pos.c \ + cut_keep.c \ + cut_research_in_cone.c \ + init_button.c \ + events_redirect.c \ + maths_obj_csg.c \ + +INC_NAME = rt.h \ + mlx.h \ + libft.h \ + parser.h\ + keys.h + +CC = gcc -Wextra -Werror -Wall -o3 +MLX_FLAGS = -lft -lmlx -framework OpenGL -framework Appkit +LIBFT = libft.a +LIBMLX = libmlx.a +LIBFT_DIR = libft/ +LIB_DIR = lib/ +INC_DIR = inc/ +EXEC_NAME = RT + +INC = $(addprefix inc/,$(INC_NAME)) +OBJ = $(addprefix $(O_PATH), $(C_FILES:.c=.o)) +SRC = $(addprefix $(C_PATH), $(C_FILES)) + +###### + +C_PATH = ./src/ +O_PATH = ./obj/ + +$(addprefix $(O_PATH),%.o): $(addprefix $(C_PATH),%.c) + @mkdir -p $(O_PATH) + @$(CC) -o $@ -c $^ -I inc/ + @echo -n . + +all: $(NAME) + +$(NAME): create_libft obj_comp $(OBJ) + @$(CC) -o $(NAME) $(OBJ) -Llib $(MLX_FLAGS) + @echo "\n\x1b[32m-- COMPILING SUCCESSFULL --" + +create_libft: + @echo "\x1b[31mMaking LIBFT ...\033[0m" + @make -s -C $(LIBFT_DIR) + @mkdir -p lib + @cp $(LIBFT_DIR)$(LIBFT) $(LIB_DIR)$(LIBFT) + @cp $(LIBFT_DIR)/includes/libft.h $(INC_DIR)libft.h + +obj_comp: + @echo "\x1b[33m-- COMPILING ... --\033[0m" + +norminette: + @echo "----------NORMINETTE------------" + @echo "\x1b[37m" + @norminette ./libft/*.h + @norminette ./libft/*.c + @norminette ./inc/*.h + @norminette ./src/*.c + +welcome: + @echo "Welcome to our project." + @echo "To launch the program, please use both following commands" + @echo "> make\n> ./RT" + +clean: + @make fclean -C $(LIBFT_DIR) + @echo "libft cleaned" + @rm -f $(INC_DIR)libft.h + @rm -f $(INC_DIR)mlx.h + @rm -rf ./obj + @rm -rf ./lib + @echo ".o cleaned" + +fclean: clean + @rm -f $(NAME) + @echo "exec deleted" + @echo "Project Cleaned." + +re: fclean all + +fcleanlibft: + make fclean -C $(LIBFT_DIR) diff --git a/Manual.1 b/Manual.1 new file mode 100644 index 0000000..72f66f1 --- /dev/null +++ b/Manual.1 @@ -0,0 +1,265 @@ +.TH RT 6 "January 09, 2017" +.SH NAME +RT - Scene renderer using RayTracing method +.SH SYNOPSIS +RT +.SH DESCRIPTION +RT is a program made to render scenes mades of primitives. the different scenes must be placed in the "./scenes" folder, right next to the compiled program. the scenes must also follow semantics rules, else the behavior of the program is undefined. +.SH SCENE SYNTAX +As mentionned above, a scene must follow a specific syntax, it can contain : +.TP 20 +.B Parameters +: Used to define characteristics of the scene, or an object. +.TP 20 +.B Declarators +: Create a new object and modify it with parameters. +.P 20 +Here is how they are used : +.br +.B Declarator[,declarator arg] +.br +.B { +.br +.B Parameter:arguments +.br +.B } +.br +if a parameter is used outside of any declarator, it is attributed to the scene itself, modifying its properties. +.SH PARAMETERS LIST +Every parameters and their description : +.P +AAlvl:0 - 255 | define the Anti-Aliasing multiplier +.br +reflections:0 - 255 | define the number of reflexions a ray can support +.br +ambient:0 - 1 | define the amount of ambient light the scene apply +.br +translate:X Y Z | define a translation matrix +.br +rotate_[x|y|z]:-360 - 360 | define a rotation matrix along the selected angle +.br +scale:X Y Z | define a scale matrix +.br +color:R G B | define a color +.br +shine:0 - 1 | define the specular property of an object +.br +reflection:0 - 1 | define the reflection level of an object +.br +texture:file.xpm | define the texture to be displayed on an object +.br +bumpmap:file.xpm | define a bumpmap to apply on an object +.br +texmodifier:[1|2|3|4] | define a dynamic texture modifier [SINX|SINY|SINXY|QUAD] +.br +texscale:X Y | define the amount of times the texture is repeated in one unit +.br +texoffset:X Y | define an offset in units of the texture +.br +sheetmode:[0|1] | activate or not the sheet mode for the HYPERBOLOID [off|on] +.br +vertex_[a|b|c|d]:X Y Z | define a vertex as needed by certain objects +.br +absolute:[0|1] | define a cut as absolute, using world coordinates instead of parent [off|on] +.br +orientation:X Y Z | define an orientation vector, should be normalised to prevent undefined behaviors +.br +look_at:X Y Z | define a location to witch the camera will look initially +.SH SUPPORTED DECLARATORS AND PARAMETERS +Here is listed every declarators and their supported parameters : +.P 20 +.B ROOT +.br +{ +.br +AAlvl:X +.br +reflections:X +.br +ambient:X +.br +} +.P 20 +.B [SPHERE|PLANE|CYLINDER|CONE|PARABOLOID] +.br +{ +.br +translate:X Y Z +.br +rotate_[x|y|z]:X +.br +scale:X Y Z +.br +color:R G B +.br +shine:X +.br +reflection:X +.br +texture:file.xpm +.br +bumpmap:file.xpm +.br +texmodifier:X +.br +texscale:X Y +.br +texoffset:X Y +.br +} +.P 20 +.B HYPERBOLOID +.br +{ +.br +translate:X Y Z +.br +rotate_[x|y|z]:X +.br +scale:X Y Z +.br +color:R G B +.br +shine:X +.br +reflection:X +.br +texture:file.xpm +.br +bumpmap:file.xpm +.br +texmodifier:X +.br +texscale:X Y +.br +texoffset:X Y +.br +sheetmode:X +.br +} +.P 20 +.B TRIANGLE +.br +{ +.br +translate:X Y Z +.br +rotate_[x|y|z]:X +.br +scale:X Y Z +.br +color:R G B +.br +shine:X +.br +reflection:X +.br +vertex_[a|b|c]:X Y Z +.br +} +.P 20 +.B PRISM +.br +{ +.br +translate:X Y Z +.br +rotate_[x|y|z]:X +.br +scale:X Y Z +.br +color:R G B +.br +shine:X +.br +reflection:X +.br +vertex_[a|b|c|d]:X Y Z +.br +} +.P 20 +.B CUBE +.br +{ +.br +translate:X Y Z +.br +rotate_[x|y|z]:X +.br +scale:X Y Z +.br +color:R G B +.br +shine:X +.br +reflection:X +.br +vertex_[a|b]:X Y Z +.br +} +.P 20 +.B CUT +.br +{ +.br +translate:X Y Z +.br +rotate_[x|y|z]:X +.br +scale:X Y Z +.br +color:R G B +.br +shine:X +.br +reflection:X +.br +texture:file.xpm +.br +bumpmap:file.xpm +.br +texmodifier:X +.br +texscale:X Y +.br +texoffset:X Y +.br +absolute:X +.br +} +.P 20 +.B CSG,[INTER|UNION|DIFF] +.br +{ +.br +[DECLARATOR1] +.br +{...} +.br +[DECLARATOR2] +.br +{...} +.br +} +.P 20 +.B CAMERA +.br +{ +.br +position:X Y Z +.br +orientation:X Y Z +.br +look_at:X Y Z +.br +} +.P 20 +.B LIGHT +.br +{ +.br +position:X Y Z +.br +color:R G B +.br +} diff --git a/README.md b/README.md index f557bf6..9f8c959 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,9 @@ # rt -rt : a raytracing engine made using minilibx. Features all quadrics, CSG objects, bumpmapping and texture mapping amongst other features. \ No newline at end of file +rt : a raytracing engine made using minilibx. Features all quadrics, CSG objects, bumpmapping and texture mapping amongst other features. + +You need to have to minilibx installed to run it. It will not compile on linux systems. + +Most scenes wont work as I've deleted heavy texture files from the original repo. + +It's a team project for 4 students. diff --git a/auteur b/auteur new file mode 100644 index 0000000..1c15c8f --- /dev/null +++ b/auteur @@ -0,0 +1,4 @@ +scebula +gbrochar +ntrahy +qviguier diff --git a/inc/keys.h b/inc/keys.h new file mode 100644 index 0000000..ea2c131 --- /dev/null +++ b/inc/keys.h @@ -0,0 +1,93 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* keys.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/07/24 22:34:33 by scebula #+# #+# */ +/* Updated: 2017/01/10 12:27:47 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef KEYS_H +# define KEYS_H + +# define KEY_Q 12 +# define KEY_W 13 +# define KEY_E 14 +# define KEY_R 15 +# define KEY_T 17 +# define KEY_Y 16 +# define KEY_U 32 +# define KEY_I 34 +# define KEY_O 31 +# define KEY_P 35 +# define KEY_A 0 +# define KEY_S 1 +# define KEY_D 2 +# define KEY_F 3 +# define KEY_G 5 +# define KEY_H 4 +# define KEY_J 38 +# define KEY_K 40 +# define KEY_L 37 +# define KEY_Z 6 +# define KEY_X 7 +# define KEY_C 8 +# define KEY_V 9 +# define KEY_B 11 +# define KEY_N 45 +# define KEY_M 46 +# define KEY_1 18 +# define KEY_2 19 +# define KEY_3 20 +# define KEY_4 21 +# define KEY_5 23 +# define KEY_6 22 +# define KEY_7 26 +# define KEY_8 28 +# define KEY_9 25 +# define KEY_0 29 +# define KEY_F1 122 +# define KEY_F2 120 +# define KEY_F3 99 +# define KEY_F4 118 +# define KEY_F5 96 +# define KEY_F6 97 +# define KEY_F7 98 +# define KEY_F8 100 +# define KEY_F9 101 +# define KEY_F10 109 +# define KEY_F11 103 +# define KEY_F12 111 +# define KEY_LEFT 123 +# define KEY_RIGHT 124 +# define KEY_UP 126 +# define KEY_DOWN 125 +# define KEY_TAB 48 +# define KEY_SHIFTL 257 +# define KEY_FN 279 +# define KEY_CTRL 256 +# define KEY_ALTL 261 +# define KEY_CMDL 259 +# define KEY_CMDR 260 +# define KEY_SPACE 49 +# define KEY_ALTR 262 +# define KEY_ENTER 36 +# define KEY_MINUS 27 +# define KEY_EQUAL 24 +# define KEY_BACKSPACE 51 +# define KEY_BRACKETL 33 +# define KEY_BRACKETR 30 +# define KEY_ANTISLASH 42 +# define KEY_ESC 53 +# define KEY_TILT 50 +# define KEY_COMMA 43 +# define KEY_DOT 47 +# define KEY_SLASH 44 +# define KEY_SEMICOLON 41 +# define MOUSE_WHEEL_BOTTOM 5 +# define MOUSE_WHEEL_UP 4 +# define KEY_APO 3 +#endif diff --git a/inc/parser.h b/inc/parser.h new file mode 100644 index 0000000..55bc369 --- /dev/null +++ b/inc/parser.h @@ -0,0 +1,37 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* parser.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/11/28 13:41:38 by ntrahy #+# #+# */ +/* Updated: 2017/01/10 21:25:02 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef PARSER_H +# define PARSER_H + +# define DOUBLE 0 +# define STRING 1 +# define NOTHING 0 +# define CONTEXT_OPENER 1 +# define CONTEXT_CLOSER 2 +# define DECLARATOR 3 +# define PARAMETER 4 + +# define UNION 1 +# define INTER 2 +# define DIFF 3 + +# define TWO_ATOF ft_atof(cache->params[0]), ft_atof(cache->params[1]) + +# define POS cache->pos +# define FN cache->filename +# define PARAM_NAME cache->param_name +# define PARAMS cache->params +# define CAC cache + +# include "rt.h" +#endif diff --git a/inc/rt.h b/inc/rt.h new file mode 100644 index 0000000..6740c3f --- /dev/null +++ b/inc/rt.h @@ -0,0 +1,100 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* rt.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/10 21:43:48 by scebula #+# #+# */ +/* Updated: 2017/01/10 21:43:51 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef RT_H +# define RT_H + +# include "libft.h" +# include "mlx.h" +# include "keys.h" +# include "threads.h" +# include "rt_structs.h" +# include "rt_proto.h" +# include "parser.h" +# include + +# define THREADS 8 +# define AA_LVL 1 +# define ACC 0.000001 +# define REFLECTIONS 2 +# define AMBIENT 0.5 +# define DIFFUSE 1 + +# define WIDTH 1000 +# define HEIGHT 640 + +# define FOUND 1 +# define NOT_FOUND 0 + +# define ROTATION_X 0 +# define ROTATION_Y 1 +# define ROTATION_Z 2 +# define TRANSLATION 3 +# define SCALE 4 +# define ROTATION_XYZ 5 + +# define SPHERE 0 +# define PLANE 1 +# define CYLINDER 2 +# define CONE 3 +# define TRIANGLE 4 +# define PRISM 5 +# define CUBE 6 +# define PARABOLOID 7 +# define HYPERBOLOID 8 +# define CSG 9 + +# define OBJECT_NUMBER 10 +# define TO_SPHERE obj->solid->sphere +# define TO_PLANE obj->solid->plane +# define TO_CYLINDER obj->solid->cylinder +# define TO_CONE obj->solid->cone +# define TO_TRIANGLE obj->solid->triangle +# define TO_PRISM obj->solid->prism +# define TO_CUBE obj->solid->cube +# define TO_PARABOLOID obj->solid->paraboloid +# define TO_HYPERBOLOID obj->solid->hyperboloid +# define TO_CSG obj->solid->csg +# define COLOR ((t_color (*)(t_obj *))d->func->get_obj_color[info->type]) + +# define GET_COLOR_MOY(X,Y) moy(img_pull_pixel(X, Y, &tex->img)) / (double)255 + +# define INITIAL_RAY 0 +# define SHADOW_RAY 1 +# define REFLECTION_RAY 2 + +# define TF_NORMAL 0 +# define TF_RAY 1 +# define TF_INTERSECTION 2 + +# define ABS(X) (X) < 0 ? -(X) : (X) + +# define SINX 1 +# define SINY 2 +# define QUAD 3 +# define SINXY 4 + +# define DOUBLE 0 +# define STRING 1 +# define NOTHING 0 +# define CONTEXT_OPENER 1 +# define CONTEXT_CLOSER 2 +# define DECLARATOR 3 +# define PARAMETER 4 + +# define UNION 1 +# define INTER 2 +# define DIFF 3 + +# define NEXT 1 + +#endif diff --git a/inc/rt_proto.h b/inc/rt_proto.h new file mode 100644 index 0000000..7ff9696 --- /dev/null +++ b/inc/rt_proto.h @@ -0,0 +1,468 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* rt_proto.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/09 18:33:58 by scebula #+# #+# */ +/* Updated: 2017/01/09 20:37:07 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef RT_PROTO_H +# define RT_PROTO_H + +/* +** Tools +*/ + +void swap_double(double *a, double *b); + +/* +** Main function +*/ + +void raytracer(t_data *d); + +/* +** Intersection computing +*/ + +void get_plane_n(t_ray ray, t_obj *obj, + t_thread *thread, double *dist); +void n_ray_plane(t_ray ray, t_obj *obj, + t_thread *thread, double *dist); + +void get_sphere_n(t_ray ray, t_obj *obj, + t_thread *thread, double *dist); +void n_ray_sphere(t_ray ray, t_obj *obj, + t_thread *thread, double *dist); + +void get_triangle_n(t_ray ray, t_obj *obj, + t_thread *thread, double *dist); +void n_ray_triangle(t_ray ray, t_obj *obj, + t_thread *thread, double *dist); + +void get_cone_n(t_ray ray, t_obj *obj, + t_thread *thread, double *dist); +void n_ray_cone(t_ray ray, t_obj *obj, + t_thread *thread, double *dist); + +void get_cylinder_n(t_ray ray, t_obj *obj, + t_thread *thread, double *dist); +void n_ray_cylinder(t_ray ray, t_obj *obj, + t_thread *thread, double *dist); + +void get_cube_n(t_ray ray, t_obj *obj, + t_thread *thread, double *dist); +void n_ray_cube(t_ray ray, t_obj *obj, + t_thread *thread, double *dist); + +void get_prism_n(t_ray ray, t_obj *obj, + t_thread *thread, double *dist); +void n_ray_prism(t_ray ray, t_obj *obj, + t_thread *thread, double *dist); + +void get_paraboloid_n(t_ray ray, t_obj *obj, + t_thread *thread, double *dist); +void n_ray_paraboloid(t_ray ray, t_obj *obj, + t_thread *thread, double *dist); +void get_hyperboloid_n(t_ray ray, t_obj *obj, + t_thread *thread, double *dist); +void n_ray_hyperboloid(t_ray ray, t_obj *obj, + t_thread *thread, double *dist); + +void get_csg_n(t_research *r, t_thread *thread, t_data *d); +t_solid *get_csg_solid(void *p); +/* +** Img init +*/ + +t_img *init_img(void *mlx, int length, int height); +void putpixel(int x, int y, unsigned int color, t_img *img); + +t_texture *get_texture_data(t_data *d, char *path); +t_record *find_n(t_ray ray, t_data *d, t_thread *thread); +t_color *get_color_at(t_data *d, t_record *info); +t_color get_pixel_color(t_data *d, t_record *info, int type); + +/* +** Free functions +*/ + +void free_env(t_env *e); +void free_prec_split(t_p_cache *cache); +void free_data(t_data *d); +t_img *free_img(void *mlx, t_img *img); +t_obj *free_obj(t_obj **begin_light_list); +t_sphere *free_sphere(t_sphere *sphere); +t_plane *free_plane(t_plane *plane); +t_triangle *free_triangle(t_triangle *triangle); +t_cylinder *free_cylinder(t_cylinder *cylinder); +t_cone *free_cone(t_cone *cone); +t_csg *free_csg(t_csg *csg); +void free_info(t_record *info); +t_tf_list *free_tf_list(t_tf_list **begin_tf_list); +t_light *free_light_list(t_light **begin_light_list); +t_func *free_functions(t_func *func); +void free_scene_list(t_scene *s); +void free_butt(t_butt *butt_lst); +t_cube *free_cube(t_cube *cube); +t_hyperboloid *free_hyperboloid(t_hyperboloid *hyperboloid); +t_paraboloid *free_paraboloid(t_paraboloid *paraboloid); +t_prism *free_prism(t_prism *prism); +t_csg *free_csg(t_csg *csg); +void free_texture(void *mlx, t_texture *begin_texture); +t_obj *free_cut(t_obj **begin_cut); +void select_free_obj(t_obj *tmp); + +/* +** Color functions +*/ + +unsigned char moy(t_color color); +t_color set_color(int r, int g, int b); +void color_add(t_color *c1, t_color c2); +t_color copy_color(t_color color); +void color_divide(t_color *c, double d); +void color_multiply(t_color *c1, t_color c2); +void color_scale(t_color *color, double scalar); +void color_add_nolimit(t_color *c1, t_color c2); +int get_color(t_color color); +int get_obj_color(t_obj *obj); +t_ray calculate_ray(t_data *d, double x, double y, t_thread *thread); +void calculate_refl_ray(t_record *info); +void add_refls(t_data *d, t_record *info, + t_color *final_color); +void specular_color(t_record *info, t_color *final_color, + t_light *light_list); +void add_diffuse_and_specular(t_record *info, t_data *d, + t_light *light_list, t_color *final_color); + +void ft_error(void); +void ft_malloc_error(void); + +t_texture *texturegetter(char type, t_obj *obj); +t_texture *bumpmapgetter(char type, t_obj *obj); +char texmodifiergetter(char type, t_obj *obj); +double texscalex(char type, t_obj *obj, double in); +double texscaley(char type, t_obj *obj, double in); +double texoffx(char type, t_obj *obj, double in); +double texoffy(char type, t_obj *obj, double in); + +/* +** Scenes create -> Init +*/ + +t_func *init_function(void); + +t_cam init_cam(t_vect pos, t_vect dir); +void create_cam(t_cam *cam, t_data *d); + +t_data *init_data(int argc, char **argv); +t_obj *create_default_obj(t_data *d); +void init_info_zero(t_record *info); + +t_light *init_light(); +void push_light(t_light **begin_light, t_light *light); + +void create_default_lights(t_data *d); +t_solid *init_solid(void *obj, char type); + +t_ray init_ray(t_vect ori, t_vect dir); + +t_sphere *init_sphere(double rad); +void apply_color_sphere(t_sphere *sphere, t_color color, + double reflection, double shine); +t_obj *push_sphere(t_obj **begin_obj, t_sphere *sphere); + +t_plane *init_plane(void); +t_obj *add_plane(t_plane *plane); +void apply_color_plane(t_plane *plane, t_color color, + double reflection, double shine); +t_obj *push_plane(t_obj **begin_obj, t_plane *plane); + +t_plane *init_plane(void); +t_obj *push_plane(t_obj **begin_obj, t_plane *plane); +void apply_color_plane(t_plane *plane, + t_color color, double reflection, double shine); + +t_cone *init_cone(double alpha); +t_obj *push_cone(t_obj **begin_obj, t_cone *cone); +void apply_color_cone(t_cone *cone, + t_color color, double reflection, double shine); + +t_cylinder *init_cylinder(void); +t_obj *push_cylinder(t_obj **begin_obj, t_cylinder *cylinder); +void apply_color_cylinder(t_cylinder *cylinder, + t_color color, double reflection, double shine); + +t_obj *add_triangle(t_triangle *triangle); +t_triangle *init_triangle(void); +t_triangle *init_tri_w_p(t_vect a, t_vect b, t_vect c); +void apply_color_triangle(t_triangle *triangle, + t_color color, double reflection, double shine); + +t_triangle *compute_triangle(t_triangle *triangle); +t_vect compute_triangle_normal(t_triangle *t); +void calculate_sides(t_triangle *triangle); +t_obj *push_triangle(t_obj **begin_obj, t_triangle *triangle); + +t_cube *init_cube(void); +t_cube *compute_cube(t_cube *cube); +t_obj *push_cube(t_obj **begin_obj, t_cube *cube); + +t_prism *init_prism(void); +t_prism *compute_prism(t_prism *prism); +t_obj *push_prism(t_obj **begin_obj, t_prism *prism); + +t_paraboloid *init_paraboloid(void); +t_obj *push_paraboloid(t_obj **begin_obj, t_paraboloid *paraboloid); + +t_hyperboloid *init_hyperboloid(int sheets); +t_obj *push_hyperboloid(t_obj **begin_obj, t_hyperboloid *hyper); + +t_csg *init_csg(); +t_obj *push_csg(t_obj **begin_obj, t_csg *csg); +/* +** Matrix +*/ + +t_matrix init_xrotation_matrix(double theta); +t_matrix init_yrotation_matrix(double theta); +t_matrix init_zrotation_matrix(double theta); +t_matrix init_translation_matrix(double x, double y, double z); +t_matrix init_scale_matrix(double x, double y, double z); +t_matrix init_xyzrotation_matrix(double theta, double x, + double y, double z); +t_vect get_bumped_vect(t_vect normal, t_vect transformed); + +void push_xrot_tf(t_tf_list **blist, double deg); +void push_yrot_tf(t_tf_list **blist, double deg); +void push_zrot_tf(t_tf_list **blist, double deg); +void push_trans_tf(t_tf_list **blist, double x, double y, double z); +void push_scale_tf(t_tf_list **blist, double x, double y, double z); +t_tf_list *add_xrot_tf(double deg); +t_tf_list *add_yrot_tf(double deg); +t_tf_list *add_zrot_tf(double deg); +t_tf_list *add_trans_tf(t_vect t); +t_tf_list *add_scale_tf(double x, double y, double z); + +void apply_matrix(t_matrix matrix, t_vect *v); +t_matrix get_inverse_matrix(t_matrix m); + +void apply_tf(t_obj *obj, t_vect *v, t_data *d, int type); +void apply_inverse_tf(t_obj *obj, t_vect *v, t_data *d); + +/* +** Get object values +*/ + +void define_obj_color(t_record *info); +t_color get_plane_color(t_obj *obj); +t_color get_cylinder_color(t_obj *obj); +t_color get_sphere_color(t_obj *obj); +t_color get_cone_color(t_obj *obj); +t_color get_triangle_color(t_obj *obj); +t_color get_prism_color(t_obj *obj); +t_color get_cube_color(t_obj *obj); +t_color get_paraboloid_color(t_obj *obj); +t_color get_hyperboloid_color(t_obj *obj); + +t_tf_list *get_cylinder_tf_list(t_obj *obj); +t_tf_list *get_sphere_tf_list(t_obj *obj); +t_tf_list *get_plane_tf_list(t_obj *obj); +t_tf_list *get_cone_tf_list(t_obj *obj); +t_tf_list *get_triangle_tf_list(t_obj *obj); +t_tf_list *get_prism_tf_list(t_obj *obj); +t_tf_list *get_cube_tf_list(t_obj *obj); +t_tf_list *get_paraboloid_tf_list(t_obj *obj); +t_tf_list *get_hyperboloid_tf_list(t_obj *obj); +t_vect define_obj_normal(t_record *info, t_data *d, t_thread *thread); +t_vect get_cylinder_normal(t_obj *obj, t_vect n, t_thread *thread); +t_vect get_sphere_normal(t_obj *obj, t_vect n, t_thread *thread); +t_vect get_plane_normal(t_obj *obj, t_vect n, t_thread *thread); +t_vect get_cone_normal(t_obj *obj, t_vect n, t_thread *thread); +t_vect get_triangle_normal(t_obj *obj, t_vect n, t_thread *thread); +t_vect get_prism_normal(t_obj *obj, t_vect n, t_thread *thread); +t_vect get_cube_normal(t_obj *obj, t_vect n, t_thread *thread); +t_vect get_paraboloid_normal(t_obj *obj, t_vect n, t_thread *thread); +t_vect get_hyperboloid_normal(t_obj *obj, t_vect n, t_thread *thread); + +t_solid *get_cone_solid(void *p); +t_solid *get_sphere_solid(void *p); +t_solid *get_plane_solid(void *p); +t_solid *get_cylinder_solid(void *p); +t_solid *get_triangle_solid(void *p); +t_solid *get_prism_solid(void *p); +t_solid *get_cube_solid(void *p); +t_solid *get_paraboloid_solid(void *p); +t_solid *get_hyperboloid_solid(void *p); +t_solid *get_csg_solid(void *p); + +/* +** Vector +*/ + +t_vect init_vector(double x, double y, double z, double w); +void negative_vector(t_vect *v); +double vector_magnitude(t_vect v); +void normalize_vector(t_vect *v); +void mult_vector(t_vect *v, double d); +void add_to_vector(t_vect *v1, t_vect v2); +double dot_product_vector(t_vect v1, t_vect v2); +t_vect cross_product_vector(t_vect v1, t_vect v2); +t_vect copy_vector(t_vect v); +void substract_to_vector(t_vect *v1, t_vect v2); + +/* +** MLX +*/ + +int welcome_to_rt(t_env *e); +void remake(t_data *d); +void display_again(t_data *d); +void reload_env(t_env *e); +int ft_close_cross(t_env *e); + +int events_key(int keycode, t_env *e); +int events_key_menu(int keycode, t_env *e); +int events_key_scene(int keycode, t_data *d); +int events_mouse(int button, int x, int y, t_env *e); +int events_mouse_menu(int button, int x, int y, t_env *e); +int events_mouse_scene(int button, int x, int y, t_data *d); + +void event_mov_fwd(t_data *d); +void event_mov_bwd(t_data *d); +void event_mov_strafe_lft(t_data *d); +void event_mov_strafe_rgt(t_data *d); +void event_mov_dwn(t_data *d); +void event_mov_up(t_data *d); +void event_mov_look_left(t_data *d); +void event_mov_look_right(t_data *d); +void event_mov_look_up(t_data *d); +void event_mov_look_down(t_data *d); +void idostuff(t_data *d); +void add_eblouissement(t_data *d); + +t_scene *get_scene_list(void); +void load_scenes(t_env *e); +void foreach_d_thumbnail(t_env *e); +void display_scenes(t_env *e); +void init_data_zero(t_data *d); +t_env *init_env(void); +void init_default_scene(t_env *e); +int select_scene(t_env *e, int k); +t_butt *init_butt(void); +int clic_scene(t_env *e, int x, int y); +void print_page_string(t_env *e); +char *get_scene_name(int nb, char *name); + +/* +** POST PRO +*/ + +void **init_post_pro(void); +t_color img_get_hit(double x, double y, t_texture *tex, char alter); +t_color img_pull_pixel(int x, int y, t_img *img); +t_img *img_map_pixel(t_data *d, int (*f)(t_color)); +void img_recolor(t_data *d, int (*f)(t_color)); +int img_b_n_w(t_color c); +int img_sepia(t_color c); +int img_negative(t_color c); +void img_anaglyph(t_data *d); +void generate_scene(t_data *d, int argc, char **argv); +void ft_parsing_error(int linenbr, char *line, char *filename); +void lexer(int fd, char *filename); +void cache_init(t_p_cache *cache, char *filename); + +/* +** Q +*/ +void transform(t_tf_list **lst, char *param_name, char **params, + t_p_cache *cache); +void attributeboth(double *xa, double *ya, float xb, float yb); +int tf(char *lolilol, int line, t_p_cache *cache); +char isempty(char *str); +void parser(int fd, t_data *d, char *filename); +void manage_root_parameters(t_p_cache *cache, t_data *d); +void declarator_redirect(int fd, t_p_cache *cache, + t_obj **lst, t_obj **cut); +char line_identifier(t_p_cache *cache); +void populatesphere(int fd, t_p_cache *c, t_obj **lst); +void manage_sphere_params(t_p_cache *cache, t_sphere *sphere); +void populatecylinder(int fd, t_p_cache *c, t_obj **lst); +void manage_cylinder_params(t_p_cache *cache, t_cylinder *cylinder); +void populatecone(int fd, t_p_cache *cache, t_obj **lst); +void manage_cone_params(t_p_cache *cache, t_cone *cone); +void populateplane(int fd, t_p_cache *cache, t_obj **lst); +void manage_plane_params(t_p_cache *cache, t_plane *plane); +void populatetriangle(int fd, t_p_cache *cache, t_obj **lst); +void manage_triangle_params(t_p_cache *cache, t_triangle *triangle); +void populateprism(int fd, t_p_cache *cache, t_obj **lst); +void manage_prism_params(t_p_cache *cache, t_prism *prism); +void populatecube(int fd, t_p_cache *cache, t_obj **lst); +void manage_cube_params(t_p_cache *cache, t_cube *cube); +void populateparaboloid(int fd, t_p_cache *cache, t_obj **lst); +void manage_paraboloid_params(t_p_cache *cache, + t_paraboloid *paraboloid); +void populatehyperboloid(int fd, t_p_cache *cache, t_obj **lst); +void manage_hyperboloid_params(t_p_cache *cache, + t_hyperboloid *hyperboloid); +void populatelight(int fd, t_p_cache *cache, t_light **lst); +void manage_light_params(t_p_cache *cache, t_light *light); +void populatecsg(int fd, t_p_cache *cache, t_obj **lst, + char booleantype); +void disect_param(char *str, char **param, char ***args); +char chk(char **params, int n, + int (*f)(char *, int, struct s_p_cache *), t_p_cache *cache); +void populatecamera(int fd, t_p_cache *cache); +void manage_camera_params(t_p_cache *cache, t_cam *cam); +int parsetest_vector(char *line, int linenbr, t_p_cache *cache); +t_vect get_bumped_vect(t_vect normal, t_vect transformed); +int one_double_required(char *name); +int three_double_required(char *name); +int accepted_types(char *str, int scope); + +/* +** CUT OBJECTS +*/ + +void save_dist(t_research *r, t_cut *cut, t_thread *thread); +void select_negative_case(t_research *r, t_cut *cut); +void select_positive_case(t_research *r, t_cut *cut); +void select_special_case(t_research *r, t_cut *cut); +void save_negative_plane(t_research *r, t_cut *cut); +void save_positive_plane(t_research *r, t_cut *cut); +void save_cutted_object(t_research *r, t_cut *cut); +void save_nothing(t_research *r, t_cut *cut); +int keep_plane(t_cut *cut); +int keep_nothing(t_research *r, t_cut *cut); +int research_in_cone(t_research *r, t_cut *cut); +int research_in_others(t_research *r, t_cut *cut); +void init_cut_condition_cone(t_research *r, t_cut *cut); +void init_cut_condition_others(t_research *r, t_cut *cut); +void if_plane_cut_an_object(t_data *d, t_record *info, + t_thread *thread); +void init_var(t_research *r, t_ray ray); +t_vect find_n_pos(t_ray ray, t_record *info); +void find_n_dist(t_research *r, t_data *d, t_thread *thread); +void check_cut(t_research *r, t_data *d, t_thread *thread); +void init_csg_data(t_csg_data *c_data, t_research *r); +void init_conditions_diff(t_research *r, double *p, double *n, + int type); +int check_diff(t_research *r, t_research *rp, t_research *rn); +int check_inter(t_research *r, t_research *rp, t_research *rn); +int check_add(t_research *r, t_research *rp, t_research *rn); + +/* +** DEBUG +*/ + +void print_data(t_data *d); +void vector_state(t_vect v, char *s); +void init_default_csg(t_data *d); +void print_objects(t_data *d); + +#endif diff --git a/inc/rt_structs.h b/inc/rt_structs.h new file mode 100644 index 0000000..2f868ed --- /dev/null +++ b/inc/rt_structs.h @@ -0,0 +1,472 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* rt_structs.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/11 12:12:16 by scebula #+# #+# */ +/* Updated: 2017/01/11 13:03:04 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef RT_STRUCTS_H +# define RT_STRUCTS_H + +typedef struct s_matrix +{ + char type; + double m11; + double m12; + double m13; + double m14; + double m21; + double m22; + double m23; + double m24; + double m31; + double m32; + double m33; + double m34; + double m41; + double m42; + double m43; + double m44; +} t_matrix; + +typedef struct s_img +{ + char *data; + int sl; + int endian; + int bpp; + void *img; + int x; + int y; +} t_img; + +typedef struct s_texture +{ + t_img img; + struct s_texture *next; + char *path; +} t_texture; + +typedef struct s_tf_list +{ + t_matrix tf; + struct s_tf_list *previous; + struct s_tf_list *next; + char type; +} t_tf_list; + +typedef struct s_vect +{ + double x; + double y; + double z; + double w; +} t_vect; + +typedef struct s_ray +{ + t_vect ori; + t_vect dir; +} t_ray; + +typedef struct s_cam +{ + t_vect pos; + t_vect dir; + t_vect first_pixel_dir; + double cam_plane_dist; + double plane_height; + double plane_width; + t_vect left; + t_vect up; +} t_cam; + +typedef struct s_color +{ + int r; + int g; + int b; +} t_color; + +typedef struct s_light +{ + t_vect pos; + t_color color; + struct s_light *next; +} t_light; + +typedef struct s_plane +{ + t_color color; + t_tf_list *tf_list; + double reflection; + double shine; + double off_x; + double off_y; + double scale_x; + double scale_y; + double dist; + t_vect normal; + t_texture *texture; + char texmodifier; + t_texture *bumpmap; + struct s_obj *cut; + struct s_obj **cutted_obj; + int cut_type; +} t_plane; + +typedef struct s_triangle +{ + t_color color; + t_tf_list *tf_list; + double reflection; + double shine; + t_vect normal; + double distance; + t_vect a; + t_vect b; + t_vect c; + t_vect ab; + t_vect ac; + t_vect ba; + t_vect bc; + t_vect cb; + t_vect ca; + t_texture *texture; + t_texture *bumpmap; + struct s_obj *cut; +} t_triangle; + +typedef struct s_prism +{ + struct s_obj **triangle; + t_vect a; + t_vect b; + t_vect c; + t_vect d; + t_tf_list *tf_list; + int *closest_triangle; + t_color color; + double reflection; + double shine; + t_texture *texture; + t_texture *bumpmap; + struct s_obj *cut; +} t_prism; + +typedef struct s_cube +{ + struct s_obj **triangle; + t_vect corner1; + t_vect corner2; + t_tf_list *tf_list; + int *closest_triangle; + t_color color; + double reflection; + double shine; + t_texture *texture; + t_texture *bumpmap; + struct s_obj *cut; +} t_cube; + +typedef struct s_sphere +{ + t_color color; + t_tf_list *tf_list; + double reflection; + double shine; + double off_x; + double off_y; + double scale_x; + double scale_y; + double radius; + t_texture *texture; + char texmodifier; + t_texture *bumpmap; + struct s_obj *cut; +} t_sphere; + +typedef struct s_cylinder +{ + t_color color; + t_tf_list *tf_list; + double reflection; + double shine; + double off_x; + double off_y; + double scale_x; + double scale_y; + double radius; + t_texture *texture; + char texmodifier; + t_texture *bumpmap; + struct s_obj *cut; +} t_cylinder; + +typedef struct s_cone +{ + t_color color; + t_tf_list *tf_list; + double reflection; + double shine; + double off_x; + double off_y; + double scale_x; + double scale_y; + double tan_alpha; + t_texture *texture; + char texmodifier; + t_texture *bumpmap; + struct s_obj *cut; +} t_cone; + +typedef struct s_paraboloid +{ + t_color color; + t_tf_list *tf_list; + double reflection; + double shine; + double off_x; + double off_y; + double scale_x; + double scale_y; + t_texture *texture; + char texmodifier; + t_texture *bumpmap; + struct s_obj *cut; +} t_paraboloid; + +typedef struct s_hyperboloid +{ + t_color color; + t_tf_list *tf_list; + double reflection; + double shine; + double off_x; + double off_y; + double scale_x; + double scale_y; + int sheets; + t_texture *texture; + char texmodifier; + t_texture *bumpmap; + struct s_obj *cut; +} t_hyperboloid; + +typedef struct s_csg +{ + struct s_obj *first; + struct s_obj *second; + int operation; +} t_csg; + +typedef union u_solid +{ + t_sphere *sphere; + t_plane *plane; + t_cylinder *cylinder; + t_cone *cone; + t_triangle *triangle; + t_prism *prism; + t_cube *cube; + t_paraboloid *paraboloid; + t_hyperboloid *hyperboloid; + t_csg *csg; +} t_solid; + +typedef struct s_obj +{ + int type; + double *reflectionx; + double *shinex; + t_solid *solid; + struct s_obj *cut; + struct s_obj *next; +} t_obj; + +typedef struct s_csg_condition +{ + int in_neg; + int in_pos; + int neg_behind; + int neg_front; + int out; + int in; + int c1; + int c2; + int c3; + int c4; + int c5; + int c6; + int p1; + int p2; + int p3; +} t_csg_condition; + +typedef struct s_csg_data +{ + t_obj *one; + t_obj *two; + t_ray default_ray; + t_ray ray_one; + t_ray ray_two; + double p[3]; + double n[3]; +} t_csg_data; + +typedef struct s_research +{ + t_csg_condition c; + t_obj *current_obj; + t_obj *closest_obj; + double dist[3]; + double final_dist; + t_ray modified_ray; + t_ray final_ray; +} t_research; + +typedef struct s_record +{ + t_vect n_pos; + t_vect refl_dir; + t_vect to_light_dir; + t_ray refl_ray; + t_ray to_light_ray; + t_ray ray; + t_vect normal; + float dist_to_light; + double cosinus; + double dist; + int type; + t_thread *current_thread; + t_obj *obj; + t_color color; + t_vect oldnorm; +} t_record; + +typedef struct s_cut_condition +{ + int c1; + int c2; + int c3; + int c4; + int c5; + int c6; + int p1; + int p2; + int p3; + int in; + int f; + int b; +} t_cut_condition; + +typedef struct s_cut +{ + double plane[3]; + double final_dist; + double dot; + t_ray object_ray; + t_ray modified_ray; + t_obj *current_obj; + t_obj *cutted_obj; + double final_dist_p; + t_obj *closest_negative; + t_ray closest_negative_ray; + double final_dist_n; + t_obj *closest_positive; + t_ray closest_positive_ray; + t_cut_condition c; + t_cut_condition c_p; + t_cut_condition c_n; +} t_cut; + +typedef struct s_func +{ + void **get_obj_tf_list; + void **get_obj_normal; + void **get_obj_color; + void **get_obj_n; + void **post_pro; +} t_func; + +typedef struct s_data +{ + int height; + int width; + void *mlx; + void *win; + t_img *img; + t_obj *obj; + t_func *func; + t_cam cam; + t_light *light_list; + t_texture *texturelist; + double x; + double y; + double aa_lvl; + double dpp; + char reflections; + int tld; + float ambient; + t_thread th[8]; +} t_data; + +typedef struct s_p_cache +{ + t_data *d; + char scope; + int pos; + int linelen; + char *line; + char prec; + char *filename; + char *param_name; + char **params; + +} t_p_cache; + +typedef struct s_scene +{ + char *name; + t_data *d; + struct s_scene *next; +} t_scene; + +typedef struct s_butt +{ + int xmin; + int xmax; + int ymin; + int ymax; + int moon; + struct s_butt *next; +} t_butt; + +typedef struct s_env +{ + void *mlx; + void *win; + void *img_wel; + void *img_bg; + void *img_cmd; + void *img_loading; + void *img_rendering; + t_scene *lst_scene; + t_data *current_scene; + int page; + int page_m; + int lst_size; + int in_menu; + t_butt *butt_lst; + int w; + int h; + int rendering; + int loading; + int cmd; +} t_env; +#endif diff --git a/inc/threads.h b/inc/threads.h new file mode 100644 index 0000000..ccf36de --- /dev/null +++ b/inc/threads.h @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* threads.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/03 02:12:34 by ntrahy #+# #+# */ +/* Updated: 2017/01/03 02:12:36 by ntrahy ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef THREADS_H +# define THREADS_H +# include + +typedef struct s_data t_data; +typedef struct s_thread +{ + int num; + pthread_t t; + t_data *d; + double x; + double y; +} t_thread; +#endif diff --git a/libft/Makefile b/libft/Makefile new file mode 100644 index 0000000..9426a6f --- /dev/null +++ b/libft/Makefile @@ -0,0 +1,119 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# Makefile :+: :+: :+: # +# +:+ +:+ +:+ # +# By: scebula +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2015/11/27 16:07:00 by scebula #+# #+# # +# Updated: 2016/11/18 14:30:15 by ntrahy ### ########.fr # +# # +# **************************************************************************** # + + +SRCS = ./ft_atoi.c \ + ./ft_atof.c \ + ./ft_bzero.c \ + ./ft_free_charchar.c \ + ./get_next_line.c \ + ./ft_isalnum.c \ + ./ft_isalpha.c \ + ./ft_isascii.c \ + ./ft_isdigit.c \ + ./ft_isdigits.c \ + ./ft_isprint.c \ + ./ft_isspace.c \ + ./ft_itoa.c \ + ./ft_itoa_base.c \ + ./ft_list_clear.c \ + ./ft_listlen.c \ + ./ft_lst_pushback.c \ + ./ft_lstadd.c \ + ./ft_lstdel.c \ + ./ft_lstdelone.c \ + ./ft_lstiter.c \ + ./ft_lstmap.c \ + ./ft_lstnew.c \ + ./ft_memalloc.c \ + ./ft_memccpy.c \ + ./ft_memchr.c \ + ./ft_memcmp.c \ + ./ft_memcpy.c \ + ./ft_memdel.c \ + ./ft_memmove.c \ + ./ft_memset.c \ + ./ft_printlst.c \ + ./ft_putchar.c \ + ./ft_putchar_fd.c \ + ./ft_putendl.c \ + ./ft_putendl_fd.c \ + ./ft_putnbr.c \ + ./ft_putnbr_fd.c \ + ./ft_putstr.c \ + ./ft_putstr_fd.c \ + ./ft_strcat.c \ + ./ft_strcat_new.c \ + ./ft_strchr.c \ + ./ft_strclr.c \ + ./ft_strcmp.c \ + ./ft_strcpy.c \ + ./ft_strdel.c \ + ./ft_strdup.c \ + ./ft_strequ.c \ + ./ft_striter.c \ + ./ft_striteri.c \ + ./ft_strjoin.c \ + ./ft_strlcat.c \ + ./ft_strlen.c \ + ./ft_strmap.c \ + ./ft_strmapi.c \ + ./ft_strncat.c \ + ./ft_strncmp.c \ + ./ft_strncpy.c \ + ./ft_strndup.c \ + ./ft_strnequ.c \ + ./ft_strnew.c \ + ./ft_strnstr.c \ + ./ft_strrchr.c \ + ./ft_strrchr_n.c \ + ./ft_strrev.c \ + ./ft_strsplit.c \ + ./ft_strsplit_lst.c \ + ./ft_strsplit_whitespaces.c \ + ./ft_strstr.c \ + ./ft_strsub.c \ + ./ft_strtrim.c \ + ./ft_tablen.c \ + ./ft_tolower.c \ + ./ft_toupper.c \ + ./ft_isnumeric.c + +CFLAGS = -Wall -Werror -Wextra + +CC = gcc + +INCLUDES = includes/ + +O_FILES = $(SRCS:.c=.o) + +%.o: %.c + @gcc $(CFLAGS) -I $(INCLUDES) -o $@ -c $^ + +NAME = libft.a + +all: $(NAME) + +$(NAME): $(O_FILES) + @ar cr $(NAME) $(O_FILES) + @ranlib $(NAME) + @echo "[libft compiled]" + +clean: + @rm -f $(O_FILES) + @echo "libft .o deleted" + +fclean: clean + @rm -f $(NAME) + @echo "libft.a deleted" + +re: fclean all diff --git a/libft/ft_atof.c b/libft/ft_atof.c new file mode 100644 index 0000000..303c01a --- /dev/null +++ b/libft/ft_atof.c @@ -0,0 +1,42 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_atof.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qviguier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/03/11 18:10:24 by qviguier #+# #+# */ +/* Updated: 2017/01/10 18:26:45 by ntrahy ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +float ft_atof(char *str) +{ + float rez[2]; + int dot_seen; + + rez[0] = 0; + rez[1] = 1; + dot_seen = 0; + while (*str == ' ') + str++; + if (*str == '-' || *str == '+') + rez[1] *= *(str) == '-' ? -1 : 1; + if (*str == '-' || *str == '+') + str++; + while ((ft_isdigit(*str) || *str == '.') && *str != '\0') + { + if (dot_seen == 0 && *str == '.') + dot_seen = 1; + else if (ft_isdigit(*str)) + { + if (dot_seen) + rez[1] /= 10.0f; + rez[0] = rez[0] * 10.0f + (float)(*str - '0'); + } + str++; + } + return (rez[0] * rez[1]); +} diff --git a/libft/ft_atoi.c b/libft/ft_atoi.c new file mode 100644 index 0000000..0940505 --- /dev/null +++ b/libft/ft_atoi.c @@ -0,0 +1,39 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_atoi.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 09:47:14 by scebula #+# #+# */ +/* Updated: 2015/12/04 00:21:47 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_atoi(const char *str) +{ + int n; + int sign; + + sign = 1; + n = 0; + while (ft_isspace(*str)) + str++; + if (*str == '-') + { + sign = -1; + str++; + } + else if (*str == '+') + { + str++; + } + while (*str && ft_isdigit(*str)) + { + n = n * 10 + (*str - '0'); + str++; + } + return (n * sign); +} diff --git a/libft/ft_bzero.c b/libft/ft_bzero.c new file mode 100644 index 0000000..2bb868b --- /dev/null +++ b/libft/ft_bzero.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_bzero.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/24 16:34:34 by scebula #+# #+# */ +/* Updated: 2015/11/30 01:27:31 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_bzero(void *s, size_t n) +{ + ft_memset(s, 0, n); +} diff --git a/libft/ft_free_charchar.c b/libft/ft_free_charchar.c new file mode 100644 index 0000000..75df8f7 --- /dev/null +++ b/libft/ft_free_charchar.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_free_charchar.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/30 02:48:08 by scebula #+# #+# */ +/* Updated: 2015/11/30 02:55:41 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_free_charchar(char **tab) +{ + size_t i; + + i = 0; + while (tab[i] != NULL) + { + free(tab[i]); + i++; + } +} diff --git a/libft/ft_isalnum.c b/libft/ft_isalnum.c new file mode 100644 index 0000000..2c5a75f --- /dev/null +++ b/libft/ft_isalnum.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isalnum.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 10:09:08 by scebula #+# #+# */ +/* Updated: 2015/11/26 10:12:23 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_isalnum(int c) +{ + return (ft_isdigit(c) || ft_isalpha(c)); +} diff --git a/libft/ft_isalpha.c b/libft/ft_isalpha.c new file mode 100644 index 0000000..b5b8652 --- /dev/null +++ b/libft/ft_isalpha.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isalpha.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 09:53:04 by scebula #+# #+# */ +/* Updated: 2015/11/26 09:54:06 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_isalpha(int c) +{ + return (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')); +} diff --git a/libft/ft_isascii.c b/libft/ft_isascii.c new file mode 100644 index 0000000..3fa3808 --- /dev/null +++ b/libft/ft_isascii.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isascii.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 10:14:02 by scebula #+# #+# */ +/* Updated: 2015/11/26 10:15:19 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_isascii(int c) +{ + return (0 <= c && c <= 127); +} diff --git a/libft/ft_isdigit.c b/libft/ft_isdigit.c new file mode 100644 index 0000000..a26cc1d --- /dev/null +++ b/libft/ft_isdigit.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isdigit.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 09:56:25 by scebula #+# #+# */ +/* Updated: 2016/04/27 14:19:35 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_isdigit(int c) +{ + return ('0' <= c && c <= '9'); +} diff --git a/libft/ft_isdigits.c b/libft/ft_isdigits.c new file mode 100644 index 0000000..f739a5c --- /dev/null +++ b/libft/ft_isdigits.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isdigits.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/04/26 21:54:11 by scebula #+# #+# */ +/* Updated: 2016/04/26 21:54:38 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char ft_isdigits(char *s) +{ + int i; + + i = 0; + while (s[i]) + { + if (!ft_isdigit(s[i])) + return (0); + i++; + } + return (1); +} diff --git a/libft/ft_isnumeric.c b/libft/ft_isnumeric.c new file mode 100644 index 0000000..1cf50d9 --- /dev/null +++ b/libft/ft_isnumeric.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isnumeric.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/09 18:25:11 by ntrahy #+# #+# */ +/* Updated: 2017/01/09 18:25:39 by ntrahy ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_isnumeric(int c) +{ + if (c == '+' || c == '-' || c == '.') + return (1); + return (ft_isdigit(c)); +} diff --git a/libft/ft_isprint.c b/libft/ft_isprint.c new file mode 100644 index 0000000..0a50dab --- /dev/null +++ b/libft/ft_isprint.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isprint.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 10:15:50 by scebula #+# #+# */ +/* Updated: 2015/11/26 10:16:19 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_isprint(int c) +{ + return (32 <= c && c <= 126); +} diff --git a/libft/ft_isspace.c b/libft/ft_isspace.c new file mode 100644 index 0000000..059f747 --- /dev/null +++ b/libft/ft_isspace.c @@ -0,0 +1,19 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isspace.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 09:43:41 by scebula #+# #+# */ +/* Updated: 2015/11/26 09:45:49 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_isspace(int c) +{ + return (c == ' ' || c == '\n' || c == '\v' + || c == '\f' || c == '\r' || c == '\t'); +} diff --git a/libft/ft_itoa.c b/libft/ft_itoa.c new file mode 100644 index 0000000..94eae35 --- /dev/null +++ b/libft/ft_itoa.c @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_itoa.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/25 17:56:12 by ntrahy #+# #+# */ +/* Updated: 2016/01/28 13:55:55 by ntrahy ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_itoa(int n) +{ + char *s; + + if (!(s = ft_itoa_base(n, 10))) + return (NULL); + return (s); +} diff --git a/libft/ft_itoa_base.c b/libft/ft_itoa_base.c new file mode 100644 index 0000000..87eacbe --- /dev/null +++ b/libft/ft_itoa_base.c @@ -0,0 +1,37 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_itoa_base.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/01/28 13:50:02 by ntrahy #+# #+# */ +/* Updated: 2016/11/18 14:35:11 by ntrahy ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_itoa_base(int nb, int base) +{ + char *s; + char *mem; + int neg; + + if (!(s = ft_strnew(35)) || base < 2 || base > 16) + return (NULL); + mem = s; + neg = (nb < 0); + if (!nb) + *s = '0'; + while (nb != 0) + { + *s = "0123456789ABCDEF"[(nb % base) * (neg ? -1 : 1)]; + nb /= base; + s++; + } + if (neg) + *s = '-'; + ft_strrev(mem); + return (mem); +} diff --git a/libft/ft_list_clear.c b/libft/ft_list_clear.c new file mode 100644 index 0000000..9844791 --- /dev/null +++ b/libft/ft_list_clear.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_list_clear.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/02/16 20:34:53 by scebula #+# #+# */ +/* Updated: 2016/02/16 20:34:55 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_list_clear(t_list **begin_list) +{ + t_list *tmp; + t_list *list; + + list = *begin_list; + tmp = NULL; + while (list) + { + if (list->next) + tmp = list->next; + else + tmp = NULL; + free(list->content); + list->content = NULL; + list->next = NULL; + free(list); + list = tmp; + } +} diff --git a/libft/ft_listlen.c b/libft/ft_listlen.c new file mode 100644 index 0000000..75feb8c --- /dev/null +++ b/libft/ft_listlen.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_listlen.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/04/26 21:52:57 by scebula #+# #+# */ +/* Updated: 2016/04/26 21:53:44 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +size_t ft_listlen(t_list *list) +{ + t_list *l; + size_t i; + + i = 0; + l = list; + while (l) + { + i++; + l = l->next; + } + return (i); +} diff --git a/libft/ft_lst_pushback.c b/libft/ft_lst_pushback.c new file mode 100644 index 0000000..6d46cf5 --- /dev/null +++ b/libft/ft_lst_pushback.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lst_pushback.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/30 03:51:59 by scebula #+# #+# */ +/* Updated: 2015/11/30 03:57:41 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_lst_pushback(t_list **begin_list, void *content, size_t content_size) +{ + t_list *list; + + list = *begin_list; + if (list) + { + while (list->next) + list = list->next; + list->next = ft_lstnew(content, content_size); + } + else + *begin_list = ft_lstnew(content, content_size); +} diff --git a/libft/ft_lstadd.c b/libft/ft_lstadd.c new file mode 100644 index 0000000..12ebb5c --- /dev/null +++ b/libft/ft_lstadd.c @@ -0,0 +1,19 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstadd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 13:13:20 by scebula #+# #+# */ +/* Updated: 2015/11/28 02:30:13 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_lstadd(t_list **alst, t_list *new) +{ + new->next = *alst; + *alst = new; +} diff --git a/libft/ft_lstdel.c b/libft/ft_lstdel.c new file mode 100644 index 0000000..4375b8e --- /dev/null +++ b/libft/ft_lstdel.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstdel.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 13:10:34 by scebula #+# #+# */ +/* Updated: 2015/11/26 13:12:44 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_lstdel(t_list **alst, void (*del)(void*, size_t)) +{ + t_list *robin; + t_list *batman; + + batman = *alst; + while (batman != NULL) + { + robin = batman->next; + ft_lstdelone(&batman, del); + batman = robin; + } + *alst = NULL; +} diff --git a/libft/ft_lstdelone.c b/libft/ft_lstdelone.c new file mode 100644 index 0000000..fbcd66c --- /dev/null +++ b/libft/ft_lstdelone.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstdelone.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 13:08:42 by scebula #+# #+# */ +/* Updated: 2015/11/26 13:09:18 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_lstdelone(t_list **alst, void (*del)(void*, size_t)) +{ + del((*alst)->content, (*alst)->content_size); + free(*alst); + *alst = NULL; +} diff --git a/libft/ft_lstiter.c b/libft/ft_lstiter.c new file mode 100644 index 0000000..b8a4781 --- /dev/null +++ b/libft/ft_lstiter.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstiter.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 13:18:10 by scebula #+# #+# */ +/* Updated: 2015/12/03 23:44:37 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_lstiter(t_list *lst, void (*f)(t_list *)) +{ + f(lst); + lst = lst->next; + while (lst != NULL) + { + f(lst); + lst = lst->next; + } +} diff --git a/libft/ft_lstmap.c b/libft/ft_lstmap.c new file mode 100644 index 0000000..42056d2 --- /dev/null +++ b/libft/ft_lstmap.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstmap.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 13:20:43 by scebula #+# #+# */ +/* Updated: 2015/12/04 00:07:45 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +t_list *ft_lstmap(t_list *lst, t_list *(*f)(t_list *elem)) +{ + t_list *first_element; + t_list *next_element; + t_list *previous_element; + + first_element = NULL; + first_element = f(lst); + previous_element = first_element; + lst = lst->next; + while (lst) + { + next_element = f(lst); + previous_element->next = next_element; + previous_element = next_element; + lst = lst->next; + } + previous_element->next = NULL; + return (first_element); +} diff --git a/libft/ft_lstnew.c b/libft/ft_lstnew.c new file mode 100644 index 0000000..b0532b4 --- /dev/null +++ b/libft/ft_lstnew.c @@ -0,0 +1,40 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstnew.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 12:48:01 by scebula #+# #+# */ +/* Updated: 2016/04/26 16:07:11 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +t_list *ft_lstnew(void const *content, size_t content_size) +{ + t_list *new; + + new = (t_list*)malloc(sizeof(t_list)); + if (new == NULL) + return (NULL); + if (content == NULL) + { + new->content = NULL; + new->content_size = 0; + } + else + { + new->content = malloc(content_size); + if (new->content == NULL) + { + free(new); + return (NULL); + } + ft_memcpy(new->content, content, content_size); + new->content_size = content_size; + } + new->next = NULL; + return (new); +} diff --git a/libft/ft_memalloc.c b/libft/ft_memalloc.c new file mode 100644 index 0000000..8f1c717 --- /dev/null +++ b/libft/ft_memalloc.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memalloc.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 10:23:27 by scebula #+# #+# */ +/* Updated: 2017/01/09 20:23:38 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void *ft_memalloc(size_t size) +{ + void *p; + + p = malloc(size); + if (p == NULL) + { + exit(-1); + } + else + return (ft_memset(p, 0, size)); +} diff --git a/libft/ft_memccpy.c b/libft/ft_memccpy.c new file mode 100644 index 0000000..3fad009 --- /dev/null +++ b/libft/ft_memccpy.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memccpy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/24 17:04:25 by scebula #+# #+# */ +/* Updated: 2015/11/27 20:56:04 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void *ft_memccpy(void *dest, const void *src, int c, size_t n) +{ + char *source; + char *desti; + + source = (char *)src; + desti = (char *)dest; + while (n > 0 && *source != c) + { + *desti++ = *source++; + n--; + } + if (n > 0) + { + *desti = *source; + desti++; + return ((void*)desti); + } + return (NULL); +} diff --git a/libft/ft_memchr.c b/libft/ft_memchr.c new file mode 100644 index 0000000..8c9cc32 --- /dev/null +++ b/libft/ft_memchr.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memchr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/24 19:51:45 by scebula #+# #+# */ +/* Updated: 2015/11/30 01:19:27 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void *ft_memchr(const void *s, int c, size_t n) +{ + unsigned char *src; + + src = (unsigned char*)s; + while (n > 0 && *src != (unsigned char)c) + { + src++; + n--; + } + if (n == 0) + return (NULL); + else + return ((void*)src); +} diff --git a/libft/ft_memcmp.c b/libft/ft_memcmp.c new file mode 100644 index 0000000..d678a2d --- /dev/null +++ b/libft/ft_memcmp.c @@ -0,0 +1,32 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memcmp.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/24 20:13:47 by scebula #+# #+# */ +/* Updated: 2015/11/24 20:19:34 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_memcmp(const void *s1, const void *s2, size_t n) +{ + unsigned char *a; + unsigned char *b; + + a = (unsigned char *)s1; + b = (unsigned char *)s2; + while (n > 0 && *a == *b) + { + a++; + b++; + n--; + } + if (n == 0) + return (0); + else + return (*a - *b); +} diff --git a/libft/ft_memcpy.c b/libft/ft_memcpy.c new file mode 100644 index 0000000..0444fcd --- /dev/null +++ b/libft/ft_memcpy.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memcpy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/24 16:48:35 by scebula #+# #+# */ +/* Updated: 2015/12/04 00:25:07 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void *ft_memcpy(void *dst, const void *src, size_t n) +{ + char *source; + char *desti; + + source = (char *)src; + desti = (char *)dst; + while (n > 0) + { + *desti = *source; + desti++; + source++; + n--; + } + return (dst); +} diff --git a/libft/ft_memdel.c b/libft/ft_memdel.c new file mode 100644 index 0000000..cd33fe4 --- /dev/null +++ b/libft/ft_memdel.c @@ -0,0 +1,19 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memdel.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 10:26:10 by scebula #+# #+# */ +/* Updated: 2015/11/26 10:26:37 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_memdel(void **ap) +{ + free(*ap); + *ap = NULL; +} diff --git a/libft/ft_memmove.c b/libft/ft_memmove.c new file mode 100644 index 0000000..824ca37 --- /dev/null +++ b/libft/ft_memmove.c @@ -0,0 +1,33 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memmove.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/24 17:37:47 by scebula #+# #+# */ +/* Updated: 2015/12/04 00:26:22 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void *ft_memmove(void *dst, const void *src, size_t len) +{ + char *desti; + char *source; + + desti = (char*)dst; + source = (char*)src; + if (source <= desti) + { + while (len > 0) + { + *(desti + len - 1) = *(source + len - 1); + len--; + } + } + else + ft_memcpy(desti, source, len); + return (dst); +} diff --git a/libft/ft_memset.c b/libft/ft_memset.c new file mode 100644 index 0000000..65c3332 --- /dev/null +++ b/libft/ft_memset.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* memset.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/23 16:17:13 by scebula #+# #+# */ +/* Updated: 2015/12/04 00:23:59 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void *ft_memset(void *b, int c, size_t n) +{ + unsigned char *p; + + p = (unsigned char *)b; + while (n > 0) + { + *p = (unsigned char)c; + n--; + p++; + } + return (b); +} diff --git a/libft/ft_printlst.c b/libft/ft_printlst.c new file mode 100644 index 0000000..f7ec9b7 --- /dev/null +++ b/libft/ft_printlst.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_printlst.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/12/03 20:43:58 by scebula #+# #+# */ +/* Updated: 2015/12/03 20:47:27 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_printlst(t_list *list) +{ + t_list *l; + + l = list; + while (l) + { + ft_putstr(l->content); + ft_putchar('\n'); + l = l->next; + } +} diff --git a/libft/ft_putchar.c b/libft/ft_putchar.c new file mode 100644 index 0000000..9293880 --- /dev/null +++ b/libft/ft_putchar.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putchar.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 12:03:12 by scebula #+# #+# */ +/* Updated: 2015/11/26 12:06:37 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_putchar(char c) +{ + write(1, &c, 1); +} diff --git a/libft/ft_putchar_fd.c b/libft/ft_putchar_fd.c new file mode 100644 index 0000000..d3fff13 --- /dev/null +++ b/libft/ft_putchar_fd.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putchar_fd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 12:07:59 by scebula #+# #+# */ +/* Updated: 2015/11/26 12:08:32 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_putchar_fd(char c, int fd) +{ + write(fd, &c, 1); +} diff --git a/libft/ft_putendl.c b/libft/ft_putendl.c new file mode 100644 index 0000000..b57a34a --- /dev/null +++ b/libft/ft_putendl.c @@ -0,0 +1,19 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putendl.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 12:13:28 by scebula #+# #+# */ +/* Updated: 2015/11/27 22:58:54 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_putendl(char const *s) +{ + write(1, s, ft_strlen(s)); + ft_putchar('\n'); +} diff --git a/libft/ft_putendl_fd.c b/libft/ft_putendl_fd.c new file mode 100644 index 0000000..610aaf1 --- /dev/null +++ b/libft/ft_putendl_fd.c @@ -0,0 +1,19 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putendl_fd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 12:40:02 by scebula #+# #+# */ +/* Updated: 2015/11/26 12:40:47 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_putendl_fd(char const *s, int fd) +{ + ft_putstr_fd(s, fd); + ft_putchar_fd('\n', fd); +} diff --git a/libft/ft_putnbr.c b/libft/ft_putnbr.c new file mode 100644 index 0000000..56065f7 --- /dev/null +++ b/libft/ft_putnbr.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putnbr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 12:42:01 by scebula #+# #+# */ +/* Updated: 2015/11/30 01:20:12 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_putnbr(int n) +{ + if (n == -2147483648) + ft_putstr("-2147483648"); + else + { + if (n < 0) + { + ft_putchar('-'); + n = -n; + } + if (n >= 10) + { + ft_putnbr(n / 10); + ft_putnbr(n % 10); + } + else + ft_putchar(n + '0'); + } +} diff --git a/libft/ft_putnbr_fd.c b/libft/ft_putnbr_fd.c new file mode 100644 index 0000000..1457936 --- /dev/null +++ b/libft/ft_putnbr_fd.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putnbr_fd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 12:43:46 by scebula #+# #+# */ +/* Updated: 2015/11/30 01:20:38 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_putnbr_fd(int n, int fd) +{ + if (n == -2147483648) + ft_putstr_fd("-2147483648", fd); + else + { + if (n < 0) + { + ft_putchar_fd('-', fd); + n = -n; + } + if (n >= 10) + { + ft_putnbr_fd(n / 10, fd); + ft_putnbr_fd(n % 10, fd); + } + else + ft_putchar_fd(n + '0', fd); + } +} diff --git a/libft/ft_putstr.c b/libft/ft_putstr.c new file mode 100644 index 0000000..67eb6b8 --- /dev/null +++ b/libft/ft_putstr.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putstr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 12:09:22 by scebula #+# #+# */ +/* Updated: 2015/11/26 12:10:09 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_putstr(char const *s) +{ + write(1, s, ft_strlen(s)); +} diff --git a/libft/ft_putstr_fd.c b/libft/ft_putstr_fd.c new file mode 100644 index 0000000..edaad95 --- /dev/null +++ b/libft/ft_putstr_fd.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putstr_fd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 12:11:51 by scebula #+# #+# */ +/* Updated: 2015/11/26 13:27:36 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_putstr_fd(char const *s, int fd) +{ + write(fd, s, ft_strlen(s)); +} diff --git a/libft/ft_strcat.c b/libft/ft_strcat.c new file mode 100644 index 0000000..a1f1c07 --- /dev/null +++ b/libft/ft_strcat.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strcat.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/24 21:33:24 by scebula #+# #+# */ +/* Updated: 2015/12/04 00:34:17 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strcat(char *s1, const char *s2) +{ + char *dest; + char *src; + + dest = s1; + src = (char*)s2; + if (!*src) + return (s1); + while (*dest) + dest++; + while (*src) + { + *dest = *src; + dest++; + src++; + } + *dest = '\0'; + return (s1); +} diff --git a/libft/ft_strcat_new.c b/libft/ft_strcat_new.c new file mode 100644 index 0000000..154b667 --- /dev/null +++ b/libft/ft_strcat_new.c @@ -0,0 +1,39 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strcat_new.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/07/25 16:30:30 by scebula #+# #+# */ +/* Updated: 2016/07/25 16:31:23 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strcat_new(char *s1, const char *s2) +{ + char *str; + int a; + int b; + int i; + + i = 0; + a = ft_strlen(s1); + b = ft_strlen(s2); + str = (char *)malloc(sizeof(char) * (a + b + 1)); + while (s1[i]) + { + *(str + i) = s1[i]; + i++; + } + i = 0; + while (s2[i]) + { + *(str + a + i) = s2[i]; + i++; + } + str[a + b] = '\0'; + return (str); +} diff --git a/libft/ft_strchr.c b/libft/ft_strchr.c new file mode 100644 index 0000000..d69178d --- /dev/null +++ b/libft/ft_strchr.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strchr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 09:10:36 by scebula #+# #+# */ +/* Updated: 2015/11/26 09:22:12 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strchr(const char *s, int c) +{ + while (*s && *s != (char)c) + s++; + if (*s == (char)c) + return (char *)s; + else + return (NULL); +} diff --git a/libft/ft_strclr.c b/libft/ft_strclr.c new file mode 100644 index 0000000..e24d7c7 --- /dev/null +++ b/libft/ft_strclr.c @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strclr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 10:33:01 by scebula #+# #+# */ +/* Updated: 2015/12/04 00:56:32 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_strclr(char *s) +{ + while (*s) + { + *s = '\0'; + s++; + } +} diff --git a/libft/ft_strcmp.c b/libft/ft_strcmp.c new file mode 100644 index 0000000..a887cb6 --- /dev/null +++ b/libft/ft_strcmp.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strcmp.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 09:30:45 by scebula #+# #+# */ +/* Updated: 2015/11/27 19:43:01 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_strcmp(const char *s1, const char *s2) +{ + while (*s1 && *s1 == *s2) + { + s1++; + s2++; + } + return ((unsigned char)*s1 - (unsigned char)*s2); +} diff --git a/libft/ft_strcpy.c b/libft/ft_strcpy.c new file mode 100644 index 0000000..350139c --- /dev/null +++ b/libft/ft_strcpy.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strcpy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/24 21:05:14 by scebula #+# #+# */ +/* Updated: 2015/12/04 00:29:51 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strcpy(char *dst, const char *src) +{ + int i; + + i = 0; + while (src[i]) + { + dst[i] = src[i]; + i++; + } + dst[i] = '\0'; + return (dst); +} diff --git a/libft/ft_strdel.c b/libft/ft_strdel.c new file mode 100644 index 0000000..9ae2875 --- /dev/null +++ b/libft/ft_strdel.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strdel.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 10:31:16 by scebula #+# #+# */ +/* Updated: 2015/12/04 00:56:41 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_strdel(char **as) +{ + ft_memdel((void**)as); +} diff --git a/libft/ft_strdup.c b/libft/ft_strdup.c new file mode 100644 index 0000000..6b58dc9 --- /dev/null +++ b/libft/ft_strdup.c @@ -0,0 +1,35 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strdup.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/24 20:46:25 by scebula #+# #+# */ +/* Updated: 2015/12/04 00:28:12 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strdup(const char *s1) +{ + int l; + int i; + char *str; + + i = 0; + if (!s1) + return (NULL); + l = ft_strlen(s1); + str = (char *)malloc(sizeof(char) * (l + 1)); + if (str == NULL) + return (NULL); + while (i < l) + { + str[i] = s1[i]; + i++; + } + str[i] = '\0'; + return (str); +} diff --git a/libft/ft_strequ.c b/libft/ft_strequ.c new file mode 100644 index 0000000..4acd9df --- /dev/null +++ b/libft/ft_strequ.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strequ.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 10:53:27 by scebula #+# #+# */ +/* Updated: 2015/11/26 10:54:39 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_strequ(char const *s1, char const *s2) +{ + if (ft_strcmp(s1, s2) == 0) + return (1); + return (0); +} diff --git a/libft/ft_striter.c b/libft/ft_striter.c new file mode 100644 index 0000000..9b08ec7 --- /dev/null +++ b/libft/ft_striter.c @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_striter.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 10:38:31 by scebula #+# #+# */ +/* Updated: 2015/12/03 21:49:48 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_striter(char *s, void (*f)(char *)) +{ + while (*s) + { + f(s); + s++; + } +} diff --git a/libft/ft_striteri.c b/libft/ft_striteri.c new file mode 100644 index 0000000..58facce --- /dev/null +++ b/libft/ft_striteri.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_striteri.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 10:40:23 by scebula #+# #+# */ +/* Updated: 2015/11/26 10:41:03 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_striteri(char *s, void (*f)(unsigned int, char *)) +{ + unsigned int i; + + i = 0; + while (s[i]) + { + f(i, &s[i]); + i++; + } +} diff --git a/libft/ft_strjoin.c b/libft/ft_strjoin.c new file mode 100644 index 0000000..08c66b1 --- /dev/null +++ b/libft/ft_strjoin.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strjoin.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 11:00:52 by scebula #+# #+# */ +/* Updated: 2015/12/04 00:57:09 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strjoin(char const *s1, char const *s2) +{ + char *str; + char *start; + + str = ft_strnew(ft_strlen(s1) + ft_strlen(s2)); + start = str; + if (str == NULL) + return (NULL); + while (*s1) + { + *str++ = *(char *)s1++; + } + while (*s2) + { + *str++ = *(char *)s2++; + } + *str = '\0'; + return (start); +} diff --git a/libft/ft_strlcat.c b/libft/ft_strlcat.c new file mode 100644 index 0000000..54e8535 --- /dev/null +++ b/libft/ft_strlcat.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strlcat.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/24 21:58:06 by scebula #+# #+# */ +/* Updated: 2015/12/03 22:20:35 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +size_t ft_strlcat(char *dst, const char *src, size_t size) +{ + int i; + size_t dstlen; + size_t srclen; + + dstlen = ft_strlen(dst); + srclen = ft_strlen(src); + if (size < dstlen) + return (size + srclen); + i = (int)size; + while (*dst && i >= 0) + { + dst++; + i--; + } + while (*src && i-- > 1) + *dst++ = *src++; + if (i == 1) + *dst++ = '\0'; + while (*dst) + { + *dst = '\0'; + dst++; + } + return (srclen + dstlen); +} diff --git a/libft/ft_strlen.c b/libft/ft_strlen.c new file mode 100644 index 0000000..a845153 --- /dev/null +++ b/libft/ft_strlen.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strlen.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/24 20:28:30 by scebula #+# #+# */ +/* Updated: 2015/11/24 20:42:18 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +size_t ft_strlen(const char *s) +{ + size_t i; + + i = 0; + while (*s++) + i++; + return (i); +} diff --git a/libft/ft_strmap.c b/libft/ft_strmap.c new file mode 100644 index 0000000..33c158e --- /dev/null +++ b/libft/ft_strmap.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strmap.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 10:43:35 by scebula #+# #+# */ +/* Updated: 2015/11/26 10:51:04 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strmap(char const *s, char (*f)(char)) +{ + char *str; + unsigned int i; + + str = ft_strnew(ft_strlen(s)); + if (str == NULL) + return (NULL); + i = 0; + while (s[i]) + { + str[i] = f(s[i]); + i++; + } + return (str); +} diff --git a/libft/ft_strmapi.c b/libft/ft_strmapi.c new file mode 100644 index 0000000..3f4ed12 --- /dev/null +++ b/libft/ft_strmapi.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strmapi.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 10:48:03 by scebula #+# #+# */ +/* Updated: 2015/11/26 10:51:51 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strmapi(char const *s, char (*f)(unsigned int, char)) +{ + char *str; + unsigned int i; + + str = ft_strnew(ft_strlen(s)); + if (str == NULL) + return (NULL); + i = 0; + while (s[i]) + { + str[i] = f(i, s[i]); + i++; + } + return (str); +} diff --git a/libft/ft_strncat.c b/libft/ft_strncat.c new file mode 100644 index 0000000..b6d80d2 --- /dev/null +++ b/libft/ft_strncat.c @@ -0,0 +1,35 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strncat.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/24 21:49:21 by scebula #+# #+# */ +/* Updated: 2015/12/04 00:46:06 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strncat(char *s1, const char *s2, size_t n) +{ + char *dest; + char *src; + + dest = s1; + src = (char*)s2; + if (!*src) + return (s1); + while (*dest) + dest++; + while (*src && n > 0) + { + *dest = *src; + dest++; + src++; + n--; + } + *dest = '\0'; + return (s1); +} diff --git a/libft/ft_strncmp.c b/libft/ft_strncmp.c new file mode 100644 index 0000000..fdf9769 --- /dev/null +++ b/libft/ft_strncmp.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strncmp.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 09:36:32 by scebula #+# #+# */ +/* Updated: 2015/11/27 21:56:31 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_strncmp(const char *s1, const char *s2, size_t n) +{ + size_t i; + + i = 0; + while (*s1 && *s1 == *s2 && i < n) + { + s1++; + s2++; + i++; + } + if (i == n) + return (0); + return ((unsigned char)*s1 - (unsigned char)*s2); +} diff --git a/libft/ft_strncpy.c b/libft/ft_strncpy.c new file mode 100644 index 0000000..c752cd5 --- /dev/null +++ b/libft/ft_strncpy.c @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strncpy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/24 21:13:38 by scebula #+# #+# */ +/* Updated: 2015/12/04 00:30:48 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strncpy(char *dst, const char *src, size_t n) +{ + size_t i; + + i = 0; + while (src[i] && i < n) + { + dst[i] = src[i]; + i++; + } + while (i < n) + { + dst[i] = '\0'; + i++; + } + return (dst); +} diff --git a/libft/ft_strndup.c b/libft/ft_strndup.c new file mode 100644 index 0000000..4bc5587 --- /dev/null +++ b/libft/ft_strndup.c @@ -0,0 +1,37 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strndup.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/30 02:19:00 by scebula #+# #+# */ +/* Updated: 2015/12/03 16:35:35 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strndup(const char *s, size_t n) +{ + int l; + int i; + char *str; + size_t length; + + i = 0; + if (!s) + return (NULL); + length = ft_strlen(s); + l = (n < length) ? n : length; + str = (char *)malloc(sizeof(char) * (l + 1)); + if (str == NULL) + return (NULL); + while (i < l) + { + str[i] = s[i]; + i++; + } + str[i] = '\0'; + return (str); +} diff --git a/libft/ft_strnequ.c b/libft/ft_strnequ.c new file mode 100644 index 0000000..3d70bfb --- /dev/null +++ b/libft/ft_strnequ.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strnequ.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 10:55:16 by scebula #+# #+# */ +/* Updated: 2015/11/26 10:56:03 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_strnequ(char const *s1, char const *s2, size_t n) +{ + if (ft_strncmp(s1, s2, n) == 0) + return (1); + return (0); +} diff --git a/libft/ft_strnew.c b/libft/ft_strnew.c new file mode 100644 index 0000000..17a0932 --- /dev/null +++ b/libft/ft_strnew.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strnew.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 10:27:40 by scebula #+# #+# */ +/* Updated: 2015/11/26 10:30:11 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strnew(size_t size) +{ + return ((char*)ft_memalloc(size + 1)); +} diff --git a/libft/ft_strnstr.c b/libft/ft_strnstr.c new file mode 100644 index 0000000..1e05976 --- /dev/null +++ b/libft/ft_strnstr.c @@ -0,0 +1,36 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strnstr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 17:53:36 by scebula #+# #+# */ +/* Updated: 2015/12/04 00:41:10 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strnstr(const char *s1, const char *s2, size_t n) +{ + size_t i; + size_t j; + + i = 0; + j = 0; + if (!*s2) + return ((char *)s1); + while (s1[i] && i < n) + { + j = 0; + while (s1[i + j] == s2[j] && (i + j) < n) + { + j++; + if (!s2[j]) + return ((char *)s1 + i); + } + i++; + } + return (NULL); +} diff --git a/libft/ft_strrchr.c b/libft/ft_strrchr.c new file mode 100644 index 0000000..5dab8f7 --- /dev/null +++ b/libft/ft_strrchr.c @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strrchr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 09:26:10 by scebula #+# #+# */ +/* Updated: 2015/11/27 20:25:48 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strrchr(const char *s, int c) +{ + char *last; + + last = NULL; + while (*s) + { + if (*s == (char)c) + { + last = (char*)s; + } + s++; + } + if (*s == (char)c) + return ((char *)s); + return (last); +} diff --git a/libft/ft_strrchr_n.c b/libft/ft_strrchr_n.c new file mode 100644 index 0000000..69a7213 --- /dev/null +++ b/libft/ft_strrchr_n.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strrchr_n.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/02/16 20:34:24 by scebula #+# #+# */ +/* Updated: 2016/02/20 17:04:47 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_strrchr_n(char *str, char c) +{ + int i; + + i = 0; + while (str[i]) + { + if (str[i] == c) + return (i + 1); + i++; + } + return (0); +} diff --git a/libft/ft_strrev.c b/libft/ft_strrev.c new file mode 100644 index 0000000..f9d9bf4 --- /dev/null +++ b/libft/ft_strrev.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strrev.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 11:38:52 by scebula #+# #+# */ +/* Updated: 2015/11/28 01:44:40 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_strrev(char *s) +{ + char tmp; + char *rev; + + rev = s + ft_strlen(s) - 1; + while (s < rev) + { + tmp = *s; + *s = *rev; + *rev = tmp; + s++; + rev--; + } +} diff --git a/libft/ft_strsplit.c b/libft/ft_strsplit.c new file mode 100644 index 0000000..0f1920d --- /dev/null +++ b/libft/ft_strsplit.c @@ -0,0 +1,61 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strsplit.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/28 02:35:48 by scebula #+# #+# */ +/* Updated: 2016/02/25 01:04:23 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +static int ft_count(char *s, char c) +{ + int i; + int n; + + i = 0; + n = 0; + while (s[i] == c) + { + i++; + } + while (s[i]) + { + if (s[i] == c && s[i - 1] != c) + n++; + i++; + } + if (s[i - 1] != c && !s[i]) + n++; + return (n); +} + +char **ft_strsplit(char const *s, char c) +{ + char **ss; + int new_word_start; + int i; + int index; + + i = 0; + index = 0; + ss = (char **)malloc(sizeof(char *) * (ft_count((char *)s, c) + 1)); + while (s[i]) + { + while (s[i] == c) + i++; + if (!s[i]) + break ; + new_word_start = i; + while (s[i] && s[i] != c) + i++; + ss[index++] = ft_strsub(s, new_word_start, i - new_word_start); + new_word_start = i; + } + ss[index] = NULL; + return (ss); +} diff --git a/libft/ft_strsplit_lst.c b/libft/ft_strsplit_lst.c new file mode 100644 index 0000000..94520ed --- /dev/null +++ b/libft/ft_strsplit_lst.c @@ -0,0 +1,64 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strsplit_lst.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/30 03:29:45 by scebula #+# #+# */ +/* Updated: 2015/12/03 18:02:48 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +static int ft_count(char *s, char c) +{ + int i; + int n; + + i = 0; + n = 0; + while (s[i] == c) + { + i++; + } + while (s[i]) + { + if (s[i] == c && s[i - 1] != c) + n++; + i++; + } + if (s[i - 1] != c && !s[i]) + n++; + return (n); +} + +t_list *ft_strsplit_lst(char const *s, char c) +{ + t_list *ss; + int start; + int i; + + ss = NULL; + i = 0; + if (s == (NULL)) + return (NULL); + if (ft_count((char *)s, c) > 0) + { + while (s[i]) + { + while (s[i] == c) + i++; + if (!s[i]) + break ; + start = i; + while (s[i] && s[i] != c) + i++; + ft_lst_pushback(&ss, ft_strsub(s, start, i - start), i - start + 1); + } + return (ss); + } + else + return (ft_lstnew(NULL, 0)); +} diff --git a/libft/ft_strsplit_whitespaces.c b/libft/ft_strsplit_whitespaces.c new file mode 100644 index 0000000..00e3dfe --- /dev/null +++ b/libft/ft_strsplit_whitespaces.c @@ -0,0 +1,62 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strsplit_whitespace.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/30 02:07:01 by scebula #+# #+# */ +/* Updated: 2015/12/03 20:01:05 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +static int ft_count(char *s, char c) +{ + int i; + int n; + + i = 0; + n = 0; + while (s[i] == c) + { + i++; + } + while (s[i]) + { + if (s[i] == c && s[i - 1] != c) + n++; + i++; + } + if (s[i - 1] != c && !s[i]) + n++; + return (n); +} + +char **ft_strsplit_whitespaces(char const *s) +{ + char **ss; + int start; + int i; + int index; + + i = 0; + index = 0; + if (s == (NULL)) + return (NULL); + ss = (char **)malloc(sizeof(char *) * (ft_count((char *)s, ' ') + 1)); + while (s[i]) + { + while (s[i] == ' ') + i++; + if (!s[i]) + break ; + start = i; + while (s[i] && s[i] != ' ') + i++; + ss[index++] = ft_strsub(s, start, i - start); + } + ss[index] = NULL; + return (ss); +} diff --git a/libft/ft_strstr.c b/libft/ft_strstr.c new file mode 100644 index 0000000..caeb495 --- /dev/null +++ b/libft/ft_strstr.c @@ -0,0 +1,36 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strstr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 09:28:21 by scebula #+# #+# */ +/* Updated: 2015/11/27 20:12:55 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strstr(const char *s1, const char *s2) +{ + size_t i; + size_t j; + + i = 0; + j = 0; + if (!*s2) + return ((char *)s1); + while (s1[i]) + { + j = 0; + while (s1[i + j] == s2[j]) + { + j++; + if (!s2[j]) + return ((char *)s1 + i); + } + i++; + } + return (NULL); +} diff --git a/libft/ft_strsub.c b/libft/ft_strsub.c new file mode 100644 index 0000000..7a25ec7 --- /dev/null +++ b/libft/ft_strsub.c @@ -0,0 +1,35 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strsub.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 10:57:04 by scebula #+# #+# */ +/* Updated: 2015/12/04 00:57:45 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strsub(char const *s, unsigned int start, size_t len) +{ + char *str; + size_t i; + unsigned int k; + + if (len > (ft_strlen(s) - start) || start > ft_strlen(s)) + return (NULL); + str = ft_strnew(len); + if (str == NULL) + return (NULL); + k = start; + i = 0; + while (i < len) + { + str[i] = s[k]; + i++; + k++; + } + return (str); +} diff --git a/libft/ft_strtrim.c b/libft/ft_strtrim.c new file mode 100644 index 0000000..56fd9f1 --- /dev/null +++ b/libft/ft_strtrim.c @@ -0,0 +1,36 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strtrim.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 11:03:36 by scebula #+# #+# */ +/* Updated: 2015/12/03 22:45:16 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strtrim(char const *s) +{ + size_t i; + unsigned int begin; + unsigned int end; + + i = 0; + begin = 0; + end = 0; + while (s[i] && (s[i] == ' ' || s[i] == '\t' || s[i] == '\n')) + i++; + if (s[i] == '\0') + return (ft_strnew(0)); + begin = i; + while (s[i]) + { + if (s[i] != ' ' && s[i] != '\t' && s[i] != '\n') + end = i; + i++; + } + return (ft_strsub(s, begin, (size_t)(end - begin + 1))); +} diff --git a/libft/ft_tablen.c b/libft/ft_tablen.c new file mode 100644 index 0000000..598e4a7 --- /dev/null +++ b/libft/ft_tablen.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_tablen.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/04/26 21:54:50 by scebula #+# #+# */ +/* Updated: 2016/04/26 21:54:53 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +size_t ft_tablen(char **tab) +{ + size_t i; + + i = 0; + while (tab[i]) + i++; + return (i); +} diff --git a/libft/ft_tolower.c b/libft/ft_tolower.c new file mode 100644 index 0000000..d979336 --- /dev/null +++ b/libft/ft_tolower.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_tolower.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 10:17:25 by scebula #+# #+# */ +/* Updated: 2015/11/26 10:18:18 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_tolower(int c) +{ + if (65 <= c && c <= 90) + return (c + 32); + else + return (c); +} diff --git a/libft/ft_toupper.c b/libft/ft_toupper.c new file mode 100644 index 0000000..68c175f --- /dev/null +++ b/libft/ft_toupper.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_toupper.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2015/11/26 10:19:07 by scebula #+# #+# */ +/* Updated: 2015/11/26 10:19:31 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_toupper(int c) +{ + if (97 <= c && c <= 122) + return (c - 32); + else + return (c); +} diff --git a/libft/get_next_line.c b/libft/get_next_line.c new file mode 100644 index 0000000..9c5686c --- /dev/null +++ b/libft/get_next_line.c @@ -0,0 +1,135 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_next_line.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/02/16 19:58:34 by scebula #+# #+# */ +/* Updated: 2016/04/26 21:55:11 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" +#include "get_next_line.h" + +void ft_init_data(t_data **d, int fd, char **line) +{ + if (!*d) + { + if ((*d = (t_data *)malloc(sizeof(t_data))) == NULL) + return ; + (*d)->l = ft_lstnew("", 1); + (*d)->i = 0; + } + (*d)->sp = 0; + (*d)->tmp = ft_strnew(BUFF_SIZE); + (*d)->t = (*d)->tmp; + while (((*d)->ret = read(fd, (*d)->tmp, BUFF_SIZE)) > 0) + { + (*d)->tmp[(*d)->ret] = '\0'; + ft_lst_pushback(&((*d)->l), (*d)->tmp, (size_t)(*d)->ret + 1); + (*d)->i += (size_t)(*d)->ret; + if (((*d)->sp = ft_strrchr_n((*d)->tmp, '\n'))) + break ; + } + if ((*d)->ret <= 0 && (*d)->i == 0) + return ; + ft_list_to_string(&(*d), (*d)->i, line); +} + +void ft_init_data_2(t_data **d, char **line, int fd) +{ + (*d)->i = 0; + while ((*d)->tmp[(*d)->i] != '\n' && (*d)->tmp[(*d)->i]) + (*d)->i++; + if (!(*d)->tmp[(*d)->i]) + { + (*d)->l = ft_lstnew("", 1); + if ((*d)->i != 0) + ft_lst_pushback(&(*d)->l, ft_strndup((*d)->tmp, (*d)->i), + (*d)->i + 1); + free((*d)->t); + (*d)->t = NULL; + ft_init_data(&(*d), fd, line); + } + else + { + *line = ft_strndup((*d)->tmp, (*d)->i); + (*d)->tmp = (*d)->tmp + (*d)->i + 1; + } +} + +void ft_list_to_string(t_data **d, size_t i, char **line) +{ + t_list *list; + + list = (*d)->l->next; + (*d)->t = NULL; + (*d)->s = ft_strnew(i); + while (list->next) + { + ft_strcat((*d)->s, (const char*)list->content); + list = list->next; + } + ft_strncat((*d)->s, (const char*)(list->content), (size_t)(*d)->sp - 1); + free((*d)->tmp); + (*d)->tmp = NULL; + (*d)->tmp = ft_strdup(list->content); + (*d)->t = (*d)->tmp; + list = (*d)->l; + (*d)->tmp += (*d)->sp; + ft_list_clear(&((*d)->l)); + (*d)->l = NULL; + *line = ft_strdup((*d)->s); + free((*d)->s); + (*d)->s = NULL; +} + +int get_next_line(int const fd, char **line) +{ + static t_data *d[256]; + + if (line == NULL || fd < 0 || BUFF_SIZE < 1 || fd > 255) + return (-1); + if (d[fd] && d[fd]->ret == 0) + { + ft_free_data(&(d[fd])); + return (0); + } + if (!d[fd]) + { + ft_init_data(&d[fd], fd, line); + if (!d[fd]) + return (-1); + } + else + ft_init_data_2(&d[fd], line, fd); + if (d[fd]->ret <= 0) + { + d[fd]->sp = (d[fd]->l != NULL) ? (d[fd]->sp + 1) : d[fd]->sp; + if ((d[fd]->ret == 0) && (d[fd]->sp == 0)) + return (1); + return (ft_free_data(&(d[fd]))); + } + return (1); +} + +int ft_free_data(t_data **d) +{ + int i; + + i = (int)(*d)->ret; + if (!(*d) && i < 0) + return (i); + if ((*d)->t != NULL) + { + free((*d)->t); + (*d)->t = NULL; + } + ft_list_clear(&(*d)->l); + if (*d != NULL) + free(*d); + *d = NULL; + return (i); +} diff --git a/libft/get_next_line.h b/libft/get_next_line.h new file mode 100644 index 0000000..2035c38 --- /dev/null +++ b/libft/get_next_line.h @@ -0,0 +1,36 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_next_line.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/02/16 19:58:25 by scebula #+# #+# */ +/* Updated: 2016/02/24 19:57:17 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef GET_NEXT_LINE_H +# define GET_NEXT_LINE_H +# define BUFF_SIZE 8 +# include +# include +# include +# include "libft.h" + +typedef struct s_data +{ + t_list *l; + int sp; + size_t i; + ssize_t ret; + char *s; + char *tmp; + char *t; +} t_data; +int get_next_line(int const fd, char **line); +void ft_list_to_string(t_data **d, size_t i, char **line); +void ft_init_data(t_data **d, int fd, char **line); +void ft_init_data_2(t_data **d, char **line, int fd); +int ft_free_data(t_data **d); +#endif diff --git a/libft/includes/libft.h b/libft/includes/libft.h new file mode 100644 index 0000000..5d5070b --- /dev/null +++ b/libft/includes/libft.h @@ -0,0 +1,106 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* libft.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/08 13:23:46 by scebula #+# #+# */ +/* Updated: 2017/01/08 13:23:50 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef LIBFT_H +# define LIBFT_H +# include +# include +# include +# include + +typedef struct s_list +{ + void *content; + size_t content_size; + struct s_list *next; +} t_list; + +void *ft_memset(void *b, int c, size_t n); +void *ft_memcpy(void *dst, const void *src, size_t n); +void *ft_memmove(void *dst, const void *src, size_t len); +void *ft_memccpy(void *dest, const void *src, int c, size_t n); +void ft_bzero(void *s, size_t n); +void *ft_memchr(const void *s, int c, size_t n); +int ft_memcmp(const void *s1, const void *s2, size_t n); +size_t ft_strlen(const char *s); +char *ft_strdup(const char *s1); +char *ft_strcpy(char *dst, const char *src); +char *ft_strncpy(char *dst, const char *src, size_t n); +char *ft_strcat(char *s1, const char *s2); +char *ft_strcat_new(char *s1, const char *s2); +char *ft_strncat(char *s1, const char *s2, size_t n); +size_t ft_strlcat(char *dst, const char *src, size_t size); +char *ft_strchr(const char *s, int c); +char *ft_strrchr(const char *s, int c); +char *ft_strstr(const char *s1, const char *s2); +char *ft_strnstr(const char *s1, const char *s2, size_t n); +int ft_strcmp(const char *s1, const char *s2); +int ft_strncmp(const char *s1, const char *s2, size_t n); +int ft_isspace(int c); +int ft_atoi(const char *str); +int ft_isalpha(int c); +int ft_isdigit(int c); +int ft_isalnum(int c); +int ft_isascii(int c); +int ft_isprint(int c); +int ft_isdigit(int c); +int ft_isnumeric(int c); +int ft_tolower(int c); +int ft_toupper(int c); +void *ft_memalloc(size_t size); +void ft_memdel(void **ap); +char *ft_strnew(size_t size); +void ft_strdel(char **as); +void ft_strclr(char *s); +void ft_striter(char *s, void (*f)(char *)); +void ft_striteri(char *s, void (*f)(unsigned int, char *)); +char *ft_strmap(char const *s, char (*f)(char)); +char *ft_strmapi(char const *s, char (*f)(unsigned int, char)); +int ft_strequ(char const *s1, char const *s2); +int ft_strnequ(char const *s1, char const *s2, size_t n); +char *ft_strsub(char const *s, unsigned int start, size_t len); +char *ft_strjoin(char const *s1, char const *s2); +char *ft_strtrim(char const *s); +char *ft_itoa(int n); +void ft_strrev(char *s); +void ft_putchar(char c); +void ft_putchar_fd(char c, int fd); +void ft_putstr(char const *s); +void ft_putstr_fd(char const *s, int fd); +void ft_putendl(char const *s); +void ft_putendl_fd(char const *s, int fd); +void ft_putnbr(int n); +void ft_putnbr_fd(int n, int fd); +char **ft_strsplit(char const *s, char c); +t_list *ft_lstnew(void const *content, size_t content_size); +void ft_lstdelone(t_list **alst, void (*del)(void*, size_t)); +void ft_lstdel(t_list **alst, void (*del)(void*, size_t)); +void ft_lstadd(t_list **alst, t_list *n); +void ft_lstiter(t_list *lst, void (*f)(t_list *)); +t_list *ft_lstmap(t_list *lst, t_list *(*f)(t_list *elem)); +char *ft_strndup(const char *s, size_t n); +char **ft_strsplit_whitespaces(char const *s); +void ft_free_charchar(char **tab); +void ft_lst_pushback(t_list **alst, void *c, size_t c_size); +char *ft_itoa_base(int n, int base); +t_list *ft_strsplit_lst(const char *s, char c); +void ft_printlst(t_list *list); +void ft_list_clear(t_list **begin_list); +int ft_strrchr_n(char *str, char c); +int get_next_line(int const fd, char **line); +size_t ft_listlen(t_list *list); +size_t ft_tablen(char **tab); +char ft_isdigits(char *s); +char *ft_itoa_size_t(size_t n); +float ft_atof(char *str); + +#endif diff --git a/scenes/A_Base_objects b/scenes/A_Base_objects new file mode 100644 index 0000000..fe990d8 --- /dev/null +++ b/scenes/A_Base_objects @@ -0,0 +1,66 @@ +CAMERA +{ +position:0 2 20 +look_at:0 0 0 +} +LIGHT +{ +position:0 5 3 +} +SPHERE +{ +translate:-5 1 0 +color: 255 255 0 +} +SPHERE +{ +translate:-7 3 0 +color: 0 255 255 +} +SPHERE +{ +translate:-6 -1 0 +color: 255 0 255 +} +PLANE +{ +translate:0 -3 0 +color:0 0 200 +reflection:0.1 +} +CYLINDER +{ +color: 0 0 255 +} +CYLINDER +{ +rotate_z:30 +color: 0 255 0 +} +CYLINDER +{ +rotate_z:-30 +color: 255 0 0 +} +CONE +{ +translate: 9 0 0 +reflection:0.2 +color: 60 60 60 +} +CONE +{ +rotate_z:40 +rotate_y:-40 +translate: 9 0 0 +reflection:0.2 +color: 160 160 160 +} +CONE +{ +rotate_z:-40 +rotate_y:-40 +translate: 9 0 0 +color: 230 230 230 +reflection:0.2 +} diff --git a/scenes/B_rt_group b/scenes/B_rt_group new file mode 100644 index 0000000..1ddeddf --- /dev/null +++ b/scenes/B_rt_group @@ -0,0 +1,78 @@ +SPHERE +{ +scale:2 2 2 +translate:9 0 0 +reflection:0 +shine:0 +CUT +{ +rotate_y:-90 +rotate_x:90 +scale:2 2 1 +shine:0 +texoffset:0.25 0 +texture:textures/face/large_scebula.xpm +} +} + +SPHERE +{ +scale:2 2 2 +translate:3 0 0 +reflection:0 +shine:0 +CUT +{ +rotate_y:-90 +rotate_x:90 +scale:2 2 1 +shine:0 +texoffset:0.75 0 +texture:textures/face/large_qviguier.xpm +} +} + +SPHERE +{ +scale:2 2 2 +translate:-3 0 0 +reflection:0 +shine:0 +CUT +{ +rotate_y:-90 +rotate_x:90 +scale:2 2 1 +shine:0 +texoffset:0.25 0 +texture:textures/face/large_ntrahy.xpm +} +} + +SPHERE +{ +scale:2 2 2 +translate:-9 0 0 +reflection:0 +shine:0 +CUT +{ +rotate_y:-90 +rotate_x:90 +scale:2 2 1 +shine:0 +texoffset:0.75 0 +texture:textures/face/large_gbrochar.xpm +} +} + +CAMERA +{ +position:-1 2 22 +look_at:-1 0 0 +} + +LIGHT +{ +position:0 5 40 +} diff --git a/scenes/C_Inside_of_cube b/scenes/C_Inside_of_cube new file mode 100644 index 0000000..44c43f6 --- /dev/null +++ b/scenes/C_Inside_of_cube @@ -0,0 +1,91 @@ + +CUBE +{ +vertex_a:-30 -30 30 +vertex_b:30 30 -30 +reflection:0.8 +shine:0.15 +color:0 0 0 +} + +SPHERE +{ +translate: 1 0 0 +shine:0.2 +reflection:0.1 +texture:textures/multi/t1.xpm +bumpmap:textures/multi/t1.xpm +} +SPHERE +{ +translate: -1 0 0 +color: 255 255 0 +shine:0.2 +reflection:0.1 +texture:textures/multi/t2.xpm +bumpmap:textures/multi/t2.xpm +} +SPHERE +{ +translate: 3 0 0 +color:0 255 0 +shine:0.2 +reflection:0.1 +texture:textures/multi/t9.xpm +bumpmap:textures/multi/t9.xpm +} +SPHERE +{ +translate: 1 3 0 +color:0 0 255 +shine:0.2 +reflection:0.1 +texture:textures/multi/t4.xpm +bumpmap:textures/multi/t4.xpm +} +SPHERE +{ +translate: 3 3 0 +color:255 0 255 +shine:0.2 +reflection:0.1 +texture:textures/multi/t5.xpm +bumpmap:textures/multi/t5.xpm +} +SPHERE +{ +translate: -3 0 0 +color:0 0 0 +shine:0.2 +reflection:0.1 +texture:textures/multi/t6.xpm +bumpmap:textures/multi/t6.xpm +} +SPHERE +{ +translate: -1 3 0 +color: 2 199 230 +shine:0.2 +reflection:0.1 +texture:textures/multi/t7.xpm +bumpmap:textures/multi/t7.xpm +} +SPHERE +{ +translate: -3 3 0 +color:255 255 255 +shine:0.2 +texture:textures/multi/t8.xpm +bumpmap:textures/multi/t8.xpm +} +CAMERA +{ +position:-4 2 15 +look_at:3 0 0 +} + +LIGHT +{ +position:0 5 3 +} +reflections:5 diff --git a/scenes/D_Triforce b/scenes/D_Triforce new file mode 100644 index 0000000..86129b9 --- /dev/null +++ b/scenes/D_Triforce @@ -0,0 +1,47 @@ +CAMERA +{ +position:-2 4 14 +look_at:0 2 0 +} +LIGHT +{ +position:5 3 5 +color:200 200 0 +} +CUBE +{ +color: 255 255 0 +rotate_z:135 +reflection:0.1 +scale:1 1.3 1 +CUT +{ +rotate_z:45 +} +} +CUBE +{ +color: 255 255 0 +rotate_z:135 +translate:2.8 0 0 +scale:1 1.3 1 +reflection:0.1 +CUT +{ +rotate_z:45 +} +} +CUBE +{ +color: 255 255 0 +rotate_z:135 +translate:1.4 0 0 +scale:1 1.3 1 +translate:0 1.8 0 +reflection:0.1 +CUT +{ +rotate_z:45 +} +} + diff --git a/scenes/E_Tetraedre b/scenes/E_Tetraedre new file mode 100644 index 0000000..cb10eb4 --- /dev/null +++ b/scenes/E_Tetraedre @@ -0,0 +1,54 @@ +CAMERA +{ +position:0 0 15 +look_at:0 0 0 +} +ambient:0 +LIGHT +{ +position:0 0 0 +color:0 255 0 +} +LIGHT +{ +position:-4 0 0 +color:255 0 0 +} +LIGHT +{ +position:4 0 0 +color:0 0 255 +} +CSG,DIFF +{ +PRISM +{ +scale:5 5 5 +color:255 255 255 +shine:1 +reflection:1 +} +CYLINDER +{ +rotate_x:90 +scale: 2.5 2.5 2.5 +color:255 255 255 +shine:1 +reflection:1 +} +} +SPHERE +{ +scale:0.6 0.6 0.6 +translate: 0 1 0 +} +SPHERE +{ +scale:0.6 0.6 0.6 +translate: -1 -0.5 0 +} +SPHERE +{ +scale:0.6 0.6 0.6 +translate: 1 -0.5 0 +} diff --git a/scenes/F_Damier b/scenes/F_Damier new file mode 100644 index 0000000..a65fe52 --- /dev/null +++ b/scenes/F_Damier @@ -0,0 +1,56 @@ +CAMERA +{ +position:-2 4 10 +look_at:0 1 0 +} +LIGHT +{ +position:1 2 0 +color:150 150 150 +} +LIGHT +{ +position:-1 2 0 +color:34 134 255 +} +PRISM +{ +color: 150 150 150 +reflection:1 +shine:1 +vertex_a: -2 0 0 +vertex_b: 2 0 0 +vertex_c: 0 0 -2 +vertex_d: 0 4 -1 +CUT +{ +translate: 0 0.5 0 +color: 150 150 150 +} +} +SPHERE +{ +translate: 0 1.5 -1 +texture:textures/multi/t3.xpm +CUT +{ +color:0 0 0 +rotate_z: 30 +translate:0 0.5 0 +shine:1 +} +CUT +{ +rotate_z: -30 +translate:0 0.5 0 +color:0 0 0 +shine:1 +} +} +PLANE +{ +texmodifier:3 +color:30 30 30 +reflection:0.2 +shine:0.4 +} diff --git a/scenes/G_Billard b/scenes/G_Billard new file mode 100644 index 0000000..4b947c0 --- /dev/null +++ b/scenes/G_Billard @@ -0,0 +1,212 @@ +CAMERA +{ +position:-3 14 40 +look_at:0 0 -10 +} + +LIGHT +{ +position:0 9 0 +} + +SPHERE +{ +texture:textures/billard/1.xpm +texscale: 1 -1 +translate:-2 0 -13 +scale:0.5 0.5 0.5 +reflection:0.2 +} +SPHERE +{ +texture:textures/billard/2.xpm +texscale: 1 -1 +translate:0 0 -13 +scale:0.5 0.5 0.5 +reflection:0.2 +} +SPHERE +{ +texture:textures/billard/3.xpm +texscale: 1 -1 +translate:2 0 -13 +scale:0.5 0.5 0.5 +reflection:0.2 +} +SPHERE +{ +texture:textures/billard/4.xpm +texscale: 1 -1 +translate:4 0 -13 +scale:0.5 0.5 0.5 +reflection:0.2 +} +SPHERE +{ +texture:textures/billard/5.xpm +texscale: 1 -1 +translate:6 0 -13 +scale:0.5 0.5 0.5 +reflection:0.2 +} +SPHERE +{ +texture:textures/billard/6.xpm +texscale: 1 -1 +translate:-1 0 -11 +scale:0.5 0.5 0.5 +reflection:0.2 +} +SPHERE +{ +texture:textures/billard/7.xpm +texscale: 1 -1 +translate:1 0 -11 +scale:0.5 0.5 0.5 +reflection:0.2 +} +SPHERE +{ +texture:textures/billard/8.xpm +texscale: 1 -1 +translate:3 0 -11 +scale:0.5 0.5 0.5 +reflection:0.2 +} +SPHERE +{ +texture:textures/billard/9.xpm +texscale: 1 -1 +translate:5 0 -11 +scale:0.5 0.5 0.5 +reflection:0.2 +} +SPHERE +{ +texture:textures/billard/10.xpm +texscale: 1 -1 +translate:0 0 -9 +scale:0.5 0.5 0.5 +reflection:0.2 +} +SPHERE +{ +texture:textures/billard/11.xpm +texscale: 1 -1 +translate:2 0 -9 +scale:0.5 0.5 0.5 +reflection:0.2 +} +SPHERE +{ +texture:textures/billard/12.xpm +texscale: 1 -1 +translate:4 0 -9 +scale:0.5 0.5 0.5 +reflection:0.2 +} +SPHERE +{ +texture:textures/billard/13.xpm +texscale: 1 -1 +translate:1 0 -7 +scale:0.5 0.5 0.5 +reflection:0.2 +} +SPHERE +{ +texture:textures/billard/14.xpm +texscale: 1 -1 +translate:3 0 -7 +scale:0.5 0.5 0.5 +reflection:0.2 +} +SPHERE +{ +texture:textures/billard/15.xpm +texscale: 1 -1 +translate:2 0 -5 +scale:0.5 0.5 0.5 +reflection:0.2 +} +SPHERE +{ +texscale: 1 -1 +scale:0.5 0.5 0.5 +translate:2 0 9 +reflection:0 +color:255 255 255 +} +CYLINDER +{ +scale:0.1 1 0.1 +rotate_x:85 +rotate_y:10 +translate:2 0 10 +reflection:0 +shine:0.1 +texture:textures/billard/wood.xpm +CUT +{ +rotate_z:180 +} +CUT +{ +translate:0 15 0 +} +} +PLANE +{ +texture:textures/billard/table.xpm +bumpmap:textures/billard/table.xpm +translate: 0 -0.5 0 +reflection:0.01 +CUT +{ +rotate_z:90 +translate:-7 0 0 +} +CUT +{ +rotate_z:-90 +translate:8 0 0 +} +CUT +{ +rotate_x:90 +translate:0 0 21 +} +CUT +{ +rotate_x:-90 +translate:10 0 -21 +} +} +CUBE +{ +vertex_a: -8 -1 22 +vertex_b: -7 1 -23 +color:135 90 47 +reflection:0 +} +CUBE +{ +vertex_a: -8 -1 -23 +vertex_b: 9 1 -22 +color:135 90 47 +reflection:0 +} +CUBE +{ +vertex_a: 8 -1 22 +vertex_b: 9 1 -23 +color:135 90 47 +reflection:0 +} +CUBE +{ +vertex_a: -8 -1 21 +vertex_b: 9 1 22 +color:135 90 47 +reflection:0 +} diff --git a/scenes/H_Glass b/scenes/H_Glass new file mode 100644 index 0000000..941c4d5 --- /dev/null +++ b/scenes/H_Glass @@ -0,0 +1,106 @@ +CAMERA +{ +position:-15 5 15 +look_at:0 0 0 +} +LIGHT +{ +position:100 100 100 +} +ambient:0.6 + +CONE +{ +scale:3 0.3 3 +reflection:0.1 +color:30 30 30 +texture:textures/bumpmap/glass.xpm +CUT +{ +} +CUT +{ +rotate_z:180 +translate:0 -2 0 +} +} +CYLINDER +{ +color:30 30 30 +scale:0.1 1 0.1 +reflection:0.1 +color: 150 150 150 +texture:textures/bumpmap/glass.xpm +CUT +{ +rotate_z:180 +translate:0 -0.1 0 +} +CUT +{ +translate:0 2 0 +} +} +CSG,DIFF +{ +SPHERE +{ +color: 150 150 150 +translate:0 2.4 0 +scale:0.8 1.2 0.5 +reflection:0.1 +texture:textures/bumpmap/glass.xpm +} +SPHERE +{ +color: 150 150 150 +translate:0 4 0 +scale:0.5 0.9 0.3 +reflection:0.1 +texture:textures/bumpmap/glass.xpm +} +} +PLANE +{ +scale:7 1 7 +texture:textures/bumpmap/table.xpm +bumpmap:textures/bumpmap/table.xpm +translate: 0 -0.5 0 +reflection:0.01 +shine:0.01 +CUT +{ +rotate_z:90 +translate:-5 0 0 +} +CUT +{ +rotate_z:-90 +translate:5 0 0 +} +CUT +{ +rotate_x:90 +translate:0 0 5 +} +CUT +{ +rotate_x:-90 +translate:10 0 -5 +} +} +PLANE +{ +translate:0 -0.51 0 +texture:textures/bumpmap/grass.xpm +reflection:0 +shine:0.1 +} +PLANE +{ +rotate_x:90 +translate:0 0 -100 +color: 0 191 255 +shine:0 +reflection:0 +} diff --git a/scenes/I_CSG_Ex b/scenes/I_CSG_Ex new file mode 100644 index 0000000..656c3be --- /dev/null +++ b/scenes/I_CSG_Ex @@ -0,0 +1,42 @@ +CAMERA +{ +position:0 2 12 +look_at:0 0 0 +} +LIGHT +{ +position:0 3 20 +} +CSG,DIFF +{ +CUBE +{ +vertex_a:-1 -1 1 +vertex_b:1 1 -1 +color:60 60 60 +} +SPHERE +{ +translate:0.7 0.7 1 +scale:1.3 1.3 1.3 +texture:textures/bumpmap/b4.xpm +bumpmap:textures/bumpmap/b4.xpm +} +} +CSG,DIFF +{ +SPHERE +{ +scale:0.6 0.6 0.6 +translate:0.7 0.7 1 +texture:textures/bumpmap/b5.xpm +bumpmap:textures/bumpmap/b5.xpm +} +SPHERE +{ +scale:0.6 0.6 0.6 +translate:1 1 1.5 +color:255 0 0 +shine: 0.2 +} +} diff --git a/scenes/J_Hyperboloid b/scenes/J_Hyperboloid new file mode 100644 index 0000000..bffaf5f --- /dev/null +++ b/scenes/J_Hyperboloid @@ -0,0 +1,53 @@ +CAMERA +{ +position:-2 4 10 +look_at:0 1 0 +} +LIGHT +{ +position:10 2 0 +} +HYPERBOLOID +{ +translate:2 0 0 +scale:0.4 1 0.4 +color:255 255 255 +bumpmap:textures/general/bumpmap.xpm +texture:textures/general/texturetest.xpm +sheetmode:0 +} +HYPERBOLOID +{ +translate:-6 0 0 +scale:0.4 1 0.4 +color:255 255 255 +bumpmap:textures/general/bumpmap.xpm +texture:textures/general/texturetest.xpm +sheetmode:1 +} +PLANE +{ +texture:textures/bumpmap/pb.xpm +bumpmap:textures/bumpmap/pb.xpm +reflection:0.3 +shine:0.3 +} +CUBE +{ +rotate_y: -30 +translate:4 0 -4 +color:200 200 200 +CUT +{ +color:200 200 200 +translate:0 1 0 +rotate_z: 24 +} +CUT +{ +color:200 200 200 +rotate_z: -40 +translate:1 1 0 +rotate_z: -40 +} +} diff --git a/scenes/K_All b/scenes/K_All new file mode 100644 index 0000000..fc98dd6 --- /dev/null +++ b/scenes/K_All @@ -0,0 +1,99 @@ +SPHERE +{ +translate:0 0 0 +CUT +{ +translate:0 0.5 0 +} +bumpmap:textures/general/bumpmap.xpm +} + +AAlvl:1 + +CYLINDER +{ +translate:4 0 0 +CUT +{ +translate:0 5 0 +} +CUT +{ +bumpmap:textures/general/bumpmap.xpm +translate:0 1 0 +rotate_x:75 +} +} + +CSG,DIFF +{ +CYLINDER +{ +texture:textures/general/texturetest.xpm +scale:1.2 1 1.2 +translate:4 0 0 +} +SPHERE +{ +translate:4 0.5 0.5 +} +} + +CONE +{ +translate:-4 0 0 +CUT +{ +translate:0 1 0 +rotate_x:75 +} +} + +PLANE +{ +texture:textures/general/bumpmap.xpm +bumpmap:textures/general/bumpmap.xpm +translate:8 0 0 +} + +TRIANGLE +{ +translate:-8 0 0 +} + +PRISM +{ +translate:16 0 0 +} + +CUBE +{ +translate:-16 0 0 +} + +PARABOLOID +{ +translate:24 0 0 +} + +HYPERBOLOID +{ +translate:-24 0 0 +} + +CAMERA +{ +position:0 2 35 +look_at:0 0 0 +} + +LIGHT +{ +position:0 5 3 +color: 255 0 0 +} +LIGHT +{ +position:2 5 3 +color: 0 120 0 +} diff --git a/scenes/L_Bump b/scenes/L_Bump new file mode 100644 index 0000000..6a4c95a --- /dev/null +++ b/scenes/L_Bump @@ -0,0 +1,59 @@ +CAMERA +{ +position:-8 4 14 +look_at:0 0 0 +} + +LIGHT +{ +position:0 5 3 +} +PLANE +{ +scale:3 3 3 +texture:textures/bumpmap/a1.xpm +bumpmap:textures/bumpmap/a1.xpm +translate: 0 -2 0 +} + +CUBE +{ +vertex_a: -2 -2 2 +vertex_b: 2 2 -2 +color: 200 200 200 +translate: 2 0 4 +} +CONE +{ +CUT +{ +rotate_x:180 +} +CUT +{ +translate:0 2 0 +} +scale:2 2 2 +rotate_x:180 +translate:-6 2 2 +texture:textures/bumpmap/b2.xpm +bumpmap:textures/bumpmap/b2.xpm +} +CYLINDER +{ +CUT +{ +rotate_x:180 +color:200 200 200 +} +CUT +{ +translate:0 2 0 +color:200 200 200 +} +rotate_x:90 +rotate_y: 30 +translate:-1.5 0 -1.5 +texture:textures/bumpmap/b3.xpm +bumpmap:textures/bumpmap/b3.xpm +} diff --git a/scenes/Mettaton b/scenes/Mettaton new file mode 100644 index 0000000..12303e5 --- /dev/null +++ b/scenes/Mettaton @@ -0,0 +1,1000 @@ +AAlvl:1 +ambient:0.4 +CAMERA +{ +position:-15 15 37.5 +look_at:0 3.15 0 +} + +LIGHT +{ +position:-15 16 15 +} +LIGHT +{ +position:15 16 15 +} + +PLANE +{ +scale:14 1 45.08 +rotate_x:-90 +rotate_z:-90 +rotate_y:-30 +translate:16 2 -30 +reflection:0 +shine:0 +texture:textures/Mettaton/background_wall.xpm +} + +PLANE +{ +scale:8 8 8 +rotate_y:-30 +translate:0 -10 0 +reflection:0 +shine:0 +texture:textures/Mettaton/floor.xpm +} + +PLANE +{ +CUT +{ +rotate_x:90 +translate:0 0 1 +} +CUT +{ +rotate_x:-90 +} +CUT +{ +rotate_z:-90 +translate:1 0 0 +} +CUT +{ +rotate_z:90 +} +scale:4 1 15.16 +rotate_x:-90 +rotate_z:-90 +translate:-7.58 -3 2.5 +texture:textures/Mettaton/textbox.xpm +reflection:0 +texscale:2 2 +shine:0 +} + +// BODY +CUBE +{ +vertex_a: -5 -1.5 0.8 +vertex_b: 5 7.1 -3 +color: 50 50 50 +reflection:0 +shine:0 +} +CUBE +{ +vertex_a: -4.2 -4.5 0.8 +vertex_b: 4.2 -1.5 -3 +color: 50 50 50 +reflection:0 +shine:0 +} + +// FIRST LINE +CUBE +{ +vertex_a: -3.4 4.6 1 +vertex_b: -2.2 5.6 0 +color:255 0 0 +reflection:0 +shine:0 +} +CUBE +{ +vertex_a: -2 4.6 1 +vertex_b: -0.8 5.6 0 +color:255 255 0 +reflection:0 +shine:0 +} +CUBE +{ +vertex_a: -0.6 4.6 1 +vertex_b: 0.6 5.6 0 +color:255 255 0 +reflection:0 +shine:0 +} +CUBE +{ +vertex_a: 0.8 4.6 1 +vertex_b: 2 5.6 0 +color:255 255 0 +reflection:0 +shine:0 +} +CUBE +{ +vertex_a: 2.2 4.6 1 +vertex_b: 3.4 5.6 0 +color:255 0 0 +reflection:0 +shine:0 +} +// SECOND LINE +CUBE +{ +vertex_a: -3.4 3.4 1 +vertex_b: -2.2 4.4 0 +color:255 0 0 +reflection:0 +shine:0 +} +CUBE +{ +vertex_a: -2 3.4 1 +vertex_b: -0.8 4.4 0 +color:255 0 0 +reflection:0 +shine:0 +} +CUBE +{ +vertex_a: -0.6 3.4 1 +vertex_b: 0.6 4.4 0 +color:255 255 0 +reflection:0 +shine:0 +} +CUBE +{ +vertex_a: 0.8 3.4 1 +vertex_b: 2 4.4 0 +color:255 0 0 +reflection:0 +shine:0 +} +CUBE +{ +vertex_a: 2.2 3.4 1 +vertex_b: 3.4 4.4 0 +color:255 0 0 +reflection:0 +shine:0 +} +// THIRD LINE +CUBE +{ +vertex_a: -3.4 2.2 1 +vertex_b: -2.2 3.2 0 +color:255 0 0 +reflection:0 +shine:0 +} +CUBE +{ +vertex_a: -2 2.2 1 +vertex_b: -0.8 3.2 0 +color:255 255 0 +reflection:0 +shine:0 +} +CUBE +{ +vertex_a: -0.6 2.2 1 +vertex_b: 0.6 3.2 0 +color:255 0 0 +reflection:0 +shine:0 +} +CUBE +{ +vertex_a: 0.8 2.2 1 +vertex_b: 2 3.2 0 +color:255 255 0 +reflection:0 +shine:0 +} +CUBE +{ +vertex_a: 2.2 2.2 1 +vertex_b: 3.4 3.2 0 +color:255 0 0 +reflection:0 +shine:0 +} +// FOURTH LINE +CUBE +{ +vertex_a: -3.4 1 1 +vertex_b: -2.2 2 0 +color:255 0 0 +reflection:0 +shine:0 +} +CUBE +{ +vertex_a: -2 1 1 +vertex_b: -0.8 2 0 +color:255 255 0 +reflection:0 +shine:0 +} +CUBE +{ +vertex_a: -0.6 1 1 +vertex_b: 0.6 2 0 +color:255 255 0 +reflection:0 +shine:0 +} +CUBE +{ +vertex_a: 0.8 1 1 +vertex_b: 2 2 0 +color:255 255 0 +reflection:0 +shine:0 +} +CUBE +{ +vertex_a: 2.2 1 1 +vertex_b: 3.4 2 0 +color:255 0 0 +reflection:0 +shine:0 +} +// FIFTH LINE +CUBE +{ +vertex_a: -1.7 -1 1 +vertex_b: -1 0 0 +color:70 70 0 +reflection:0 +shine:0 +} +CUBE +{ +vertex_a: -0.8 -1 1 +vertex_b: -0.1 0 0 +color:70 70 0 +reflection:0 +shine:0 +} +CUBE +{ +vertex_a: 0.1 -1 1 +vertex_b: 0.8 0 0 +color:70 70 0 +reflection:0 +shine:0 +} +CUBE +{ +vertex_a: 1 -1 1 +vertex_b: 1.7 0 0 +color:70 70 0 +reflection:0 +shine:0 +} +// SIXTH LINE +CYLINDER +{ +CUT +{ +translate:0 0.2 0 +color:100 100 50 +reflection:0 +shine:0 +} +CUT +{ +rotate_z:180 +translate:0 -0.2 0 +color:100 100 50 +reflection:0 +shine:0 +} +scale:0.7 1 0.7 +rotate_x:90 +translate:-2.4 -3.3 0.8 +color:100 100 50 +reflection:0 +shine:0 +} +CYLINDER +{ +CUT +{ +translate:0 0.2 0 +color:100 100 50 +reflection:0 +shine:0 +} +CUT +{ +rotate_z:180 +translate:0 -0.2 0 +color:100 100 50 +reflection:0 +shine:0 +} +scale:0.7 1 0.7 +rotate_x:90 +translate:-0.8 -3.3 0.8 +color:100 100 50 +reflection:0 +shine:0 +} +CYLINDER +{ +CUT +{ +translate:0 0.2 0 +color:100 100 50 +reflection:0 +shine:0 +} +CUT +{ +rotate_z:180 +translate:0 -0.2 0 +color:100 100 50 +reflection:0 +shine:0 +} +scale:0.7 1 0.7 +rotate_x:90 +translate:0.8 -3.3 0.8 +color:100 100 50 +reflection:0 +shine:0 +} +CYLINDER +{ +CUT +{ +translate:0 0.2 0 +color:100 100 50 +reflection:0 +shine:0 +} +CUT +{ +rotate_z:180 +translate:0 -0.2 0 +color:100 100 70 +reflection:0 +shine:0 +} +scale:0.7 1 0.7 +rotate_x:90 +translate:2.4 -3.3 0.8 +color:100 100 50 +reflection:0 +shine:0 +} +// LEFT ARM +// BIG PART +CYLINDER +{ +CUT +{ +color:100 100 100 +reflection:0 +shine:0 +} +CUT +{ +rotate_z:170 +translate:0 -2 0 +color:100 100 100 +reflection:0 +shine:0 +} +scale:0.5 0.5 0.5 +rotate_z:-90 +translate:-5 -0.1 -0.5 +reflection:0 +shine:0 +color:100 100 100 +} +CYLINDER +{ +CUT +{ +rotate_z:5 +color:100 100 100 +reflection:0 +shine:0 +} +CUT +{ +rotate_z:170 +translate:0 -2 0 +color:100 100 100 +reflection:0 +shine:0 +} +scale:0.5 0.5 0.5 +rotate_z:-110 +translate:-6.35 -0.05 -0.5 +reflection:0 +shine:0 +color:100 100 100 +} +CYLINDER +{ +CUT +{ +rotate_z:10 +color:100 100 100 +reflection:0 +shine:0 +} +CUT +{ +rotate_z:178 +translate:0 -2 0 +color:100 100 100 +reflection:0 +shine:0 +} +scale:0.5 0.5 0.5 +rotate_z:-130 +translate:-7.6 0.45 -0.5 +reflection:0 +shine:0 +color:100 100 100 +} +CYLINDER +{ +CUT +{ +rotate_z:15 +color:100 100 100 +reflection:0 +shine:0 +} +CUT +{ +rotate_z:177 +translate:0 -2 0 +color:100 100 100 +reflection:0 +shine:0 +} +scale:0.5 0.5 0.5 +rotate_z:-150 +translate:-8.6 1.35 -0.5 +reflection:0 +shine:0 +color:100 100 100 +} +CYLINDER +{ +CUT +{ +rotate_z:20 +color:100 100 100 +reflection:0 +shine:0 +} +CUT +{ +rotate_z:180 +translate:0 -2 0 +color:100 100 100 +reflection:0 +shine:0 +} +scale:0.5 0.5 0.5 +rotate_z:-180 +translate:-9.15 2.5 -0.5 +reflection:0 +shine:0 +color:100 100 100 +} +// SMALL PART +CYLINDER +{ +CUT +{ +color:40 40 40 +reflection:0 +shine:0 +} +CUT +{ +rotate_z:170 +translate:0 -2 0 +color:40 40 40 +reflection:0 +shine:0 +} +scale:0.4 0.4 0.4 +rotate_z:-90 +translate:-5.7 -0.1 -0.5 +reflection:0 +shine:0 +color:40 40 40 +} +CYLINDER +{ +CUT +{ +rotate_z:5 +color:40 40 40 +reflection:0 +shine:0 +} +CUT +{ +rotate_z:170 +translate:0 -2 0 +color:40 40 40 +reflection:0 +shine:0 +} +scale:0.4 0.4 0.4 +rotate_z:-118 +translate:-6.9 0.1 -0.5 +reflection:0 +shine:0 +color:40 40 40 +} +CYLINDER +{ +CUT +{ +rotate_z:10 +color:40 40 40 +reflection:0 +shine:0 +} +CUT +{ +rotate_z:178 +translate:0 -2 0 +color:40 40 40 +reflection:0 +shine:0 +} +scale:0.4 0.4 0.4 +rotate_z:-138 +translate:-8.2 0.9 -0.5 +reflection:0 +shine:0 +color:40 40 40 +} +CYLINDER +{ +CUT +{ +rotate_z:15 +color:40 40 40 +reflection:0 +shine:0 +} +CUT +{ +rotate_z:177 +translate:0 -2 0 +color:40 40 40 +reflection:0 +shine:0 +} +scale:0.4 0.4 0.4 +rotate_z:-165 +translate:-9 2 -0.5 +reflection:0 +shine:0 +color:40 40 40 +} +// LEFT HAND +SPHERE +{ +translate:-12.16 5 -0.665 +scale:0.75 0.75 0.75 +color:100 100 100 +shine:0 +reflection:0 +} +SPHERE +{ +scale:0.6 0.2 0.2 +rotate_z:-60 +translate:-9.7 4.3 -0.3 +color:100 100 100 +shine:0 +reflection:0 +} +SPHERE +{ +scale:0.6 0.2 0.2 +rotate_z:-90 +translate:-9.2 4.6 -0.3 +color:100 100 100 +shine:0 +reflection:0 +} +SPHERE +{ +scale:0.6 0.2 0.2 +rotate_z:-115 +translate:-8.7 4.4 -0.3 +color:100 100 100 +shine:0 +reflection:0 +} +SPHERE +{ +scale:0.5 0.25 0.25 +translate:-8.33 3.7 -0.33 +color:100 100 100 +shine:0 +reflection:0 +} +// RIGHT ARM +// BIG PART +CYLINDER +{ +CUT +{ +color:100 100 100 +reflection:0 +shine:0 +} +CUT +{ +rotate_z:190 +translate:0 -2 0 +color:100 100 100 +reflection:0 +shine:0 +} +scale:0.5 0.5 0.5 +rotate_z:90 +rotate_x:90 +translate:5 -0.1 -0.6 +reflection:0 +shine:0 +color:100 100 100 +} +CYLINDER +{ +CUT +{ +rotate_z:-15 +color:100 100 100 +reflection:0 +shine:0 +} +CUT +{ +rotate_z:180 +translate:0 -2 0 +color:100 100 100 +reflection:0 +shine:0 +} +scale:0.5 0.5 0.5 +rotate_z:110 +rotate_x:90 +rotate_y:-15 +translate:6.35 -0.1 -0.55 +reflection:0 +shine:0 +color:100 100 100 +} +CYLINDER +{ +CUT +{ +rotate_z:-30 +color:100 100 100 +reflection:0 +shine:0 +} +CUT +{ +rotate_z:182 +translate:0 -2 0 +color:100 100 100 +reflection:0 +shine:0 +} +scale:0.5 0.5 0.5 +rotate_z:130 +rotate_x:90 +rotate_y:-30 +translate:7.3 -0.1 0.4 +reflection:0 +shine:0 +color:100 100 100 +} +CYLINDER +{ +CUT +{ +rotate_z:-30 +color:100 100 100 +reflection:0 +shine:0 +} +CUT +{ +rotate_z:190 +translate:0 -2 0 +color:100 100 100 +reflection:0 +shine:0 +} +scale:0.5 0.5 0.5 +rotate_z:150 +rotate_x:90 +rotate_y:-45 +translate:7.6 -0.1 1.7 +reflection:0 +shine:0 +color:100 100 100 +} +CYLINDER +{ +CUT +{ +rotate_z:-30 +color:100 100 100 +reflection:0 +shine:0 +} +CUT +{ +rotate_z:180 +translate:0 -2 0 +color:100 100 100 +reflection:0 +shine:0 +} +scale:0.5 0.5 0.5 +rotate_z:180 +rotate_x:90 +rotate_y:-60 +translate:7 -0.1 3 +reflection:0 +shine:0 +color:100 100 100 +} +// SMALL PART +CYLINDER +{ +CUT +{ +color:40 40 40 +reflection:0 +shine:0 +} +CUT +{ +rotate_z:190 +translate:0 -2 0 +color:40 40 40 +reflection:0 +shine:0 +} +scale:0.4 0.4 0.4 +rotate_z:90 +rotate_x:90 +translate:5.7 -0.1 -0.6 +reflection:0 +shine:0 +color:40 40 40 +} +CYLINDER +{ +CUT +{ +rotate_z:-15 +color:40 40 40 +reflection:0 +shine:0 +} +CUT +{ +rotate_z:180 +translate:0 -2 0 +color:40 40 40 +reflection:0 +shine:0 +} +scale:0.35 0.35 0.35 +rotate_z:110 +rotate_x:90 +rotate_y:-35 +translate:7 -0.1 -0.2 +reflection:0 +shine:0 +color:40 40 40 +} +CYLINDER +{ +CUT +{ +rotate_z:-30 +color:40 40 40 +reflection:0 +shine:0 +} +CUT +{ +rotate_z:182 +translate:0 -2 0 +color:40 40 40 +reflection:0 +shine:0 +} +scale:0.4 0.4 0.4 +rotate_z:130 +rotate_x:90 +rotate_y:-37 +translate:7.55 -0.1 0.9 +reflection:0 +shine:0 +color:40 40 40 +} +CYLINDER +{ +CUT +{ +rotate_z:-30 +color:40 40 40 +reflection:0 +shine:0 +} +CUT +{ +rotate_z:190 +translate:0 -2 0 +color:40 40 40 +reflection:0 +shine:0 +} +scale:0.4 0.4 0.4 +rotate_z:150 +rotate_x:90 +rotate_y:-65 +translate:7.4 -0.1 2.5 +reflection:0 +shine:0 +color:40 40 40 +} +// RIGHT HAND +SPHERE +{ +scale:0.75 0.75 0.75 +translate:6 -0.1 3.5 +color:255 255 255 +color:100 100 100 +shine:0 +reflection:0 +} +SPHERE +{ +scale:0.6 0.2 0.2 +rotate_z:-20 +translate: 5.4 0.35 3.5 +color:100 100 100 +shine:0 +reflection:0 +} +SPHERE +{ +scale:0.6 0.2 0.2 +translate: 5.1 -0.1 3.5 +color:100 100 100 +shine:0 +reflection:0 +} +SPHERE +{ +scale:0.6 0.2 0.2 +rotate_z:20 +translate: 5.4 -0.5 3.5 +color:100 100 100 +shine:0 +reflection:0 +} +SPHERE +{ +scale:0.5 0.25 0.25 +rotate_z:90; +translate: 6 0.6 3.5 +color:100 100 100 +shine:0 +reflection:0 +} +// MIC +SPHERE +{ +scale:0.4 0.4 0.4 +translate:5.65 1.5 2.15 +reflection:0 +shine:0 +color:50 50 50 +texture:textures/Mettaton/microphone.xpm +bumpmap:textures/Mettaton/microphone.xpm +} +CONE +{ +CUT +{ +rotate_z:180 +translate:0 1 0 +reflection:0 +shine:0 +} +CUT +{ +translate:0 4 0 +reflection:0 +shine:0 +} +scale:0.5 1 0.5 +rotate_z:20 +rotate_x:-30 +translate:7 -1.8 4 +reflection:0 +shine:0 +color:20 20 20 +} +// LEG +CYLINDER +{ +CUT +{ +color:100 100 100 +reflection:0 +shine:0 +} +CUT +{ +rotate_z:180 +translate:0 -7.5 0 +color:100 100 100 +reflection:0 +shine:0 +} +scale:0.5 0.5 0.5 +translate:0 -4.5 0 +color:100 100 100 +reflection:0 +shine:0 +} +CYLINDER +{ +CUT +{ +color:100 100 100 +translate:0 0.5 0 +reflection:0 +shine:0 +} +CUT +{ +rotate_z:180 +translate:0 -0.5 0 +color:100 100 100 +reflection:0 +shine:0 +} +rotate_x:90 +translate:0 -9 0 +color:100 100 100 +reflection:0 +shine:0 +} diff --git a/scenes/N_Planets b/scenes/N_Planets new file mode 100644 index 0000000..848e377 --- /dev/null +++ b/scenes/N_Planets @@ -0,0 +1,129 @@ +CAMERA +{ +position:0 0 40 +look_at:9 0 0 +} +ambient:1 +LIGHT +{ +position:-20 0 40 +} +LIGHT +{ +position:-20 0 -40 +} +PLANE +{ +rotate_x:90 +translate:0 0 -100 +texture:textures/universe/stars.xpm +shine:0 +reflection:0 +} +SPHERE +{ +scale:0.2 0.2 0.2 +texture:textures/universe/mercure.xpm +texscale: 1 -1 +shine:0 +reflection:0 +} +SPHERE +{ +scale:0.4 0.4 0.4 +translate:2 0 0 +texture:textures/universe/venus.xpm +texscale: 1 -1 +shine:0 +reflection:0 +} +SPHERE +{ +scale:0.3 0.3 0.3 +translate:4 0 0 +texture:textures/universe/terre.xpm +texscale: 1 -1 +shine:0 +reflection:0 +} +SPHERE +{ +scale:0.2 0.2 0.2 +translate:6 0 0 +texture:textures/universe/mars.xpm +texscale: 1 -1 +shine:0 +reflection:0 +} +SPHERE +{ +scale:3 3 3 +translate:11 0 0 +texture:textures/universe/jupiter.xpm +texscale: 1 -1 +shine:0 +reflection:0 +} +SPHERE +{ +scale:2.5 2.5 2.5 +rotate_z:30 +translate:19 0 0 +texture:textures/universe/saturne.xpm +texscale: 1 -1 +shine:0 +reflection:0 +} +CSG,DIFF +{ + +SPHERE +{ +scale:5 0.03 5 +rotate_z:30 +translate:19 0 0 +texture:textures/universe/ring.xpm +texscale: 1 -1 +shine:0 +reflection:0 +} + +CYLINDER +{ +scale:3.6 1 3.6 +rotate_z:30 +translate:19 0 0 +texture:textures/universe/ring.xpm +shine:0 +reflection:0 +} +} + +SPHERE +{ +scale:1.3 1.3 1.3 +translate:26 0 0 +texture:textures/universe/uranus.xpm +texscale: 1 -1 +shine:0 +reflection:0 +} +SPHERE +{ +scale:1.2 1.2 1.2 +translate:31 0 0 +texture:textures/universe/neptune.xpm +texscale: 1 -1 +shine:0 +reflection:0 +} +SPHERE +{ +scale:13 13 13 +translate:-15 0 0 +texture:textures/universe/sun.xpm +bumpmap:textures/universe/sun.xpm +texscale: 1 -1 +shine:0 +reflection:0 +} diff --git a/scenes/O_csg_disco b/scenes/O_csg_disco new file mode 100644 index 0000000..fbd0499 --- /dev/null +++ b/scenes/O_csg_disco @@ -0,0 +1,71 @@ +CAMERA +{ +position:-2 2 10 +look_at:0 0 0 +} +LIGHT +{ +position:0 3 0 +color:255 0 0 +} +LIGHT +{ +position:-3 3 0 +color:0 255 0 +} +LIGHT +{ +position:3 3 0 +color:0 0 255 +} +LIGHT +{ +position:0 -3 0 +color:100 100 100 +} + +CSG,DIFF +{ +CUBE +{ +translate: 3 0 0 +color:255 0 0 +} +SPHERE +{ +color:30 30 30 +scale:1.2 1.2 1.2 +translate: 3 0 0 +reflection:0.1 +} +} +CSG,INTER +{ +CUBE +{ +translate: 0 0 0 +color:255 0 0 +} +SPHERE +{ +color:30 30 30 +scale:1.2 1.2 1.2 +translate: 0 0 0 +reflection:0.1 +} +} +CSG,UNION +{ +CUBE +{ +translate: -3 0 0 +color:255 0 0 +} +SPHERE +{ +color:30 30 30 +scale:1.2 1.2 1.2 +translate: -3 0 0 +reflection:0.1 +} +} diff --git a/scenes/P_CSGEx2 b/scenes/P_CSGEx2 new file mode 100644 index 0000000..58e2776 --- /dev/null +++ b/scenes/P_CSGEx2 @@ -0,0 +1,39 @@ +AAlvl:3 +CAMERA +{ +position:-2 4 10 +look_at:0 1 0 +} +LIGHT +{ +position:4 4 4 +} +CSG,DIFF +{ +PLANE +{ +texmodifier:1 +texture:textures/bumpmap/glass.xpm +bumpmap:textures/bumpmap/glass.xpm +} +SPHERE +{ +scale: 3 3 3 +translate: 1 0 0 +} +} +CSG,DIFF +{ +CYLINDER +{ +texture:textures/bumpmap/pb.xpm +bumpmap:textures/bumpmap/pb.xpm +} +CYLINDER +{ +scale: 0.8 1 0.8 +rotate_x: 90 +translate:0 1 0 +color: 255 255 255 +} +} diff --git a/src/color_maths.c b/src/color_maths.c new file mode 100644 index 0000000..f6733f5 --- /dev/null +++ b/src/color_maths.c @@ -0,0 +1,68 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* color_maths.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/11/23 04:53:43 by ntrahy #+# #+# */ +/* Updated: 2017/01/08 12:55:30 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" +#include + +void color_scale(t_color *color, double scalar) +{ + color->r = (int)((double)color->r * scalar); + if (color->r > 255) + color->r = 255; + color->g = (int)((double)color->g * scalar); + if (color->g > 255) + color->g = 255; + color->b = (int)((double)color->b * scalar); + if (color->b > 255) + color->b = 255; +} + +void color_add(t_color *c1, t_color c2) +{ + c1->r += c2.r; + if (c1->r > 255) + c1->r = 255; + c1->g += c2.g; + if (c1->g > 255) + c1->g = 255; + c1->b += c2.b; + if (c1->b > 255) + c1->b = 255; +} + +void color_add_nolimit(t_color *c1, t_color c2) +{ + c1->r += c2.r; + c1->g += c2.g; + c1->b += c2.b; +} + +void color_divide(t_color *c, double d) +{ + c->r = (int)(((double)c->r) / d); + c->g = (int)(((double)c->g) / d); + c->b = (int)(((double)c->b) / d); +} + +void color_multiply(t_color *c1, t_color c2) +{ + double r_intensity; + double g_intensity; + double b_intensity; + + r_intensity = (double)c2.r / 0xFF; + g_intensity = (double)c2.g / 0xFF; + b_intensity = (double)c2.b / 0xFF; + c1->r = (int)((double)(c1->r) * r_intensity); + c1->g = (int)((double)(c1->g) * g_intensity); + c1->b = (int)((double)(c1->b) * b_intensity); +} diff --git a/src/color_tools.c b/src/color_tools.c new file mode 100644 index 0000000..767406f --- /dev/null +++ b/src/color_tools.c @@ -0,0 +1,59 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* color_tools.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/10/01 15:08:14 by scebula #+# #+# */ +/* Updated: 2017/01/08 12:56:14 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" +#include + +t_color set_color(int r, int g, int b) +{ + t_color color; + + color.r = r; + color.g = g; + color.b = b; + return (color); +} + +t_color copy_color(t_color c) +{ + return (set_color(c.r, c.g, c.b)); +} + +int get_color(t_color color) +{ + return ((color.r << 16) + (color.g << 8) + color.b); +} + +static void transform_to_checkerboard(t_color *color, t_record *info) +{ + int square; + + square = (int)floor(info->n_pos.x) + (int)floor(info->n_pos.z); + if (square % 2 == 0) + { + color->r = 0; + color->g = 0; + color->b = 0; + } + else + { + color->r = 0xff; + color->g = 0xff; + color->b = 0xff; + } +} + +void define_obj_color(t_record *info) +{ + if (*info->obj->reflectionx == 10) + transform_to_checkerboard(&(info->color), info); +} diff --git a/src/csg_add.c b/src/csg_add.c new file mode 100644 index 0000000..b243017 --- /dev/null +++ b/src/csg_add.c @@ -0,0 +1,82 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* csg_add.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 22:03:10 by ntrahy #+# #+# */ +/* Updated: 2017/01/07 12:18:16 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +static int positive_condition_add(t_research *r, t_research *rp) +{ + if ((r->c.c1 && r->c.p1 && r->c.neg_behind) + || ((r->c.c4 || r->c.c5 || r->c.c6) && r->c.p1)) + { + r->modified_ray = rp->modified_ray; + r->current_obj = rp->current_obj; + r->dist[2] = rp->dist[0]; + return (1); + } + if (((r->c.c1 || r->c.c4 || r->c.c6) && r->c.p2) + || (r->c.c2 && (r->c.p2 || r->c.in_neg))) + { + r->modified_ray = rp->modified_ray; + r->current_obj = rp->current_obj; + r->dist[2] = rp->dist[1]; + return (1); + } + return (0); +} + +static int negative_condition_add(t_research *r, t_research *rn) +{ + if (((r->c.c1 || r->c.c2 || r->c.c3) && r->c.neg_front) + || (r->c.c6 && r->c.p3 && r->c.neg_front)) + { + r->modified_ray = rn->modified_ray; + r->current_obj = rn->current_obj; + r->dist[2] = rn->dist[0]; + return (1); + } + if (((r->c.c2 || r->c.c3 || r->c.c6) && r->c.in_neg) + || (r->c.c5 && (r->c.in_neg || r->c.p2))) + { + r->modified_ray = rn->modified_ray; + r->current_obj = rn->current_obj; + r->dist[2] = rn->dist[1]; + return (1); + } + return (0); +} + +int check_add(t_research *r, t_research *rp, t_research *rn) +{ + if (rp->dist[2] == 0 && rn->dist[2] > ACC) + { + r->modified_ray = rn->modified_ray; + r->current_obj = rn->current_obj; + r->dist[2] = rn->dist[2]; + return (1); + } + else if (rp->dist[2] > ACC && rn->dist[2] == 0) + { + r->modified_ray = rp->modified_ray; + r->current_obj = rp->current_obj; + r->dist[2] = rp->dist[2]; + return (1); + } + if (positive_condition_add(r, rp)) + return (1); + else if (negative_condition_add(r, rn)) + return (1); + else + { + r->dist[2] = 0; + return (1); + } +} diff --git a/src/csg_diff.c b/src/csg_diff.c new file mode 100644 index 0000000..a59f21c --- /dev/null +++ b/src/csg_diff.c @@ -0,0 +1,67 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* csg_diff.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 22:05:54 by ntrahy #+# #+# */ +/* Updated: 2017/01/07 12:16:18 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +static int positive_condition_diff(t_research *r, t_research *rp) +{ + if ((r->c.c1 || r->c.c4 || r->c.c5 || r->c.c6) && r->c.p1) + { + r->modified_ray = rp->modified_ray; + r->current_obj = rp->current_obj; + r->dist[2] = rp->dist[0]; + return (1); + } + if (((r->c.c1 || r->c.c6) && r->c.p2) + || ((r->c.c2 || r->c.c4) && r->c.p2 && r->c.neg_behind)) + { + r->modified_ray = rp->modified_ray; + r->current_obj = rp->current_obj; + r->dist[2] = rp->dist[1]; + return (1); + } + return (0); +} + +static int negative_condition_diff(t_research *r, t_research *rn) +{ + if (((r->c.c4 || r->c.c5) && r->c.neg_front && r->c.p2) + || (r->c.c6 && r->c.p2)) + { + r->modified_ray = rn->modified_ray; + r->current_obj = rn->current_obj; + r->dist[2] = rn->dist[0]; + return (1); + } + if ((r->c.c2 && (r->c.p1 || r->c.in_neg)) + || (r->c.c4 && r->c.in_neg)) + { + r->modified_ray = rn->modified_ray; + r->current_obj = rn->current_obj; + r->dist[2] = rn->dist[1]; + return (1); + } + return (0); +} + +int check_diff(t_research *r, t_research *rp, t_research *rn) +{ + if (positive_condition_diff(r, rp)) + return (1); + else if (negative_condition_diff(r, rn)) + return (1); + else + { + r->dist[2] = 0; + return (1); + } +} diff --git a/src/csg_inter.c b/src/csg_inter.c new file mode 100644 index 0000000..b5e8b27 --- /dev/null +++ b/src/csg_inter.c @@ -0,0 +1,65 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* csg_inter.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 22:06:38 by ntrahy #+# #+# */ +/* Updated: 2017/01/07 12:17:59 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +int positive_condition_inter(t_research *r, t_research *rp) +{ + if ((r->c.c2 || r->c.c3) && r->c.p1) + { + r->modified_ray = rp->modified_ray; + r->current_obj = rp->current_obj; + r->dist[2] = rp->dist[0]; + return (1); + } + if (((r->c.c3) && r->c.p2) + || ((r->c.c5) && r->c.p2 && r->c.in_neg)) + { + r->modified_ray = rp->modified_ray; + r->current_obj = rp->current_obj; + r->dist[2] = rp->dist[1]; + return (1); + } + return (0); +} + +int negative_condition_inter(t_research *r, t_research *rn) +{ + if ((r->c.c4 || r->c.c5) && r->c.neg_front) + { + r->modified_ray = rn->modified_ray; + r->current_obj = rn->current_obj; + r->dist[2] = rn->dist[0]; + return (1); + } + if ((r->c.c2 || r->c.c4) && r->c.in_neg) + { + r->modified_ray = rn->modified_ray; + r->current_obj = rn->current_obj; + r->dist[2] = rn->dist[1]; + return (1); + } + return (0); +} + +int check_inter(t_research *r, t_research *rp, t_research *rn) +{ + if (positive_condition_inter(r, rp)) + return (1); + else if (negative_condition_inter(r, rn)) + return (1); + else + { + r->dist[2] = 0; + return (1); + } +} diff --git a/src/cut_keep.c b/src/cut_keep.c new file mode 100644 index 0000000..2f15006 --- /dev/null +++ b/src/cut_keep.c @@ -0,0 +1,54 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* cut_keep.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 22:07:19 by ntrahy #+# #+# */ +/* Updated: 2017/01/03 12:05:27 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +int keep_plane(t_cut *cut) +{ + if (cut->dot > 0) + { + if ((cut->final_dist_p == 0 && cut->plane[2] > cut->final_dist_p) || + (cut->final_dist_p > ACC && cut->plane[2] < cut->final_dist_p + && cut->plane[2] > ACC)) + { + cut->closest_positive = cut->current_obj; + cut->closest_positive_ray = cut->modified_ray; + cut->final_dist_p = cut->plane[2]; + cut->c_p = cut->c; + } + } + else + { + if (cut->plane[2] > cut->final_dist_n && cut->plane[2] > ACC) + { + cut->closest_negative = cut->current_obj; + cut->closest_negative_ray = cut->modified_ray; + cut->final_dist_n = cut->plane[2]; + cut->c_n = cut->c; + } + } + return (1); +} + +int keep_nothing(t_research *r, t_cut *cut) +{ + r->dist[0] = 0; + r->dist[1] = 0; + r->dist[2] = 0; + cut->final_dist = 0; + r->current_obj = cut->cutted_obj; + cut->final_dist_p = 0; + cut->final_dist_n = 0; + cut->closest_negative = NULL; + cut->closest_positive = NULL; + return (0); +} diff --git a/src/cut_object.c b/src/cut_object.c new file mode 100644 index 0000000..cac83a1 --- /dev/null +++ b/src/cut_object.c @@ -0,0 +1,103 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* cut_object.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/12/08 16:42:59 by scebula #+# #+# */ +/* Updated: 2017/01/08 14:51:58 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +static void calculate_plane(t_cut *cut, t_data *d, + t_thread *thread) +{ + cut->modified_ray = cut->object_ray; + cut->plane[0] = 0; + cut->plane[1] = 0; + cut->plane[2] = 0; + if (cut->current_obj->solid->plane->cut_type == 1) + { + apply_tf(cut->cutted_obj, &(cut->modified_ray.ori), d, TF_RAY); + apply_tf(cut->cutted_obj, &(cut->modified_ray.dir), d, TF_RAY); + } + apply_inverse_tf(cut->current_obj, &(cut->modified_ray.ori), d); + apply_inverse_tf(cut->current_obj, &(cut->modified_ray.dir), d); + cut->dot = dot_product_vector(cut->modified_ray.dir, + cut->current_obj->solid->plane->normal); + get_plane_n(cut->modified_ray, cut->current_obj, thread, + cut->plane); +} + +static int research_cut(t_research *r, t_cut *cut, t_data *d, int c36) +{ + t_vect raydir; + t_vect rayori; + + if (cut->cutted_obj->type == CONE) + { + raydir = cut->object_ray.dir; + rayori = cut->object_ray.ori; + mult_vector(&(raydir), r->dist[2]); + add_to_vector(&(rayori), raydir); + raydir = r->modified_ray.dir; + if (c36 == 1) + negative_vector(&raydir); + cut->c.in = + dot_product_vector(((t_vect (*)(t_obj *, t_vect, t_thread *)) + d->func->get_obj_normal[cut->cutted_obj->type]) + (cut->cutted_obj, rayori, NULL), raydir) > 0 ? 1 : 0; + } + cut->cutted_obj->type == CONE ? init_cut_condition_cone(r, cut) : + init_cut_condition_others(r, cut); + if (cut->cutted_obj->type == CONE) + return (research_in_cone(r, cut)); + else + return (research_in_others(r, cut)); + return (0); +} + +static void init_cut(t_cut *cut, t_research *r) +{ + cut->modified_ray = r->modified_ray; + cut->object_ray = r->modified_ray; + cut->final_dist = 0; + cut->final_dist_p = 0; + cut->final_dist_n = 0; + cut->closest_negative = NULL; + cut->closest_positive = NULL; + cut->closest_positive_ray = r->modified_ray; + cut->closest_negative_ray = r->modified_ray; + cut->cutted_obj = r->current_obj; +} + +void check_cut(t_research *r, t_data *d, t_thread *thread) +{ + t_cut cut; + int type; + int c36; + + c36 = -1; + type = r->current_obj->type; + cut.current_obj = r->current_obj->cut; + if (r->dist[2] > ACC && type != HYPERBOLOID) + c36 = 0; + else if (r->dist[2] < 0 && type == CONE) + c36 = 1; + if (c36 == 1 || c36 == 0) + { + init_cut(&cut, r); + while (cut.current_obj) + { + calculate_plane(&cut, d, thread); + if (cut.plane[2] > ACC || cut.plane[2] < 0) + if (research_cut(r, &cut, d, c36) == 0) + break ; + cut.current_obj = cut.current_obj->next; + } + save_dist(r, &cut, thread); + } +} diff --git a/src/cut_research_in_cone.c b/src/cut_research_in_cone.c new file mode 100644 index 0000000..57afa81 --- /dev/null +++ b/src/cut_research_in_cone.c @@ -0,0 +1,64 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* cut_research_in_cone.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 22:11:26 by ntrahy #+# #+# */ +/* Updated: 2017/01/03 12:05:42 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +int research_in_cone(t_research *r, t_cut *cut) +{ + if ((cut->c.b && cut->dot > 0) || + (cut->c.c2 && cut->c.f && cut->c.p2 && cut->dot > 0) || + (cut->c.c4 && cut->c.f && cut->c.p1 && cut->dot > 0) || + (cut->c.c4 && cut->c.f && cut->c.p3 && cut->dot <= 0) || + (cut->c.c5 && cut->c.f && cut->c.p3 && cut->dot <= 0) || + (cut->c.c6 && cut->c.f && cut->dot <= 0)) + return (keep_nothing(r, cut)); + else if (((cut->c.c1 || cut->c.c3) && cut->c.f) || + (cut->c.c2 && cut->c.f && cut->dot > 0 && cut->c.p3) || + (cut->c.c2 && cut->c.f && cut->dot <= 0) || + (cut->c.c4 && cut->c.f && cut->dot > 0 && cut->c.p2) || + (cut->c.c4 && cut->c.f && cut->dot <= 0 && cut->c.p2) || + (cut->c.c5 && cut->c.f && cut->dot > 0 && cut->c.p2) || + (cut->c.c5 && cut->c.f && cut->dot <= 0 && cut->c.p2)) + return (keep_plane(cut)); + else if (((cut->c.c1 || cut->c.c2) && cut->c.b && cut->dot <= 0) || + ((cut->c.c3 || cut->c.c4) && cut->c.b && cut->dot <= 0) || + (cut->c.c4 && cut->c.f && cut->dot > 0 && cut->c.p3) || + (cut->c.c4 && cut->c.f && cut->dot <= 0 && cut->c.p1) || + (cut->c.c5 && cut->c.f && cut->dot > 0 && cut->c.p3) || + ((cut->c.c5 || cut->c.c6) && cut->c.b && cut->dot <= 0) || + (cut->c.c6 && cut->c.f && cut->dot > 0)) + return (NEXT); + return (0); +} + +int research_in_others(t_research *r, t_cut *cut) +{ + if ((cut->c.b && cut->dot > 0) || + (cut->c.c1 && cut->c.f && cut->c.p1 && cut->dot > 0) || + (cut->c.c1 && cut->c.f && cut->c.p3 && cut->dot <= 0) || + (cut->c.c2 && cut->c.f && cut->c.p3 && cut->dot <= 0) || + (cut->c.c3 && cut->c.f && cut->dot <= 0)) + return (keep_nothing(r, cut)); + else if ((cut->c.c1 && cut->c.f && cut->dot > 0 && cut->c.p2) || + (cut->c.c1 && cut->c.f && cut->dot <= 0 && cut->c.p2) || + (cut->c.c2 && cut->c.f && cut->dot > 0 && cut->c.p2) || + (cut->c.c2 && cut->c.f && cut->dot <= 0 && cut->c.p2)) + return (keep_plane(cut)); + else if (((cut->c.c1) && cut->c.b && cut->dot <= 0) || + (cut->c.c1 && cut->c.f && cut->dot > 0 && cut->c.p3) || + (cut->c.c1 && cut->c.f && cut->dot <= 0 && cut->c.p1) || + (cut->c.c2 && cut->c.f && cut->dot > 0 && cut->c.p3) || + ((cut->c.c2 || cut->c.c3) && cut->c.b && cut->dot <= 0) || + (cut->c.c3 && cut->c.f && cut->dot > 0)) + return (NEXT); + return (0); +} diff --git a/src/cut_save.c b/src/cut_save.c new file mode 100644 index 0000000..2422fc1 --- /dev/null +++ b/src/cut_save.c @@ -0,0 +1,91 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* cut_save.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 22:16:41 by ntrahy #+# #+# */ +/* Updated: 2017/01/07 14:48:03 by gbrochar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void if_plane_cut_an_object(t_data *d, t_record *info, + t_thread *t) +{ + int num; + + num = t ? t->num : 0; + if (info->type == PLANE) + { + if (info->obj->solid->plane->cutted_obj[num] != NULL) + { + if (info->TO_PLANE->cut_type == 0) + { + apply_tf(info->obj->solid->plane->cutted_obj[num], + &(info->ray.dir), d, TF_RAY); + apply_tf(info->obj->solid->plane->cutted_obj[num], + &(info->ray.ori), d, TF_RAY); + apply_tf(info->obj->solid->plane->cutted_obj[num], + &(info->n_pos), d, TF_INTERSECTION); + apply_tf(info->obj->solid->plane->cutted_obj[num], + &info->normal, d, TF_NORMAL); + } + info->obj->solid->plane->cutted_obj[num] = NULL; + } + } +} + +static void change_dist_zero(t_research *r, t_cut *cut, t_thread *t) +{ + r->dist[0] = cut->final_dist; + r->dist[2] = cut->final_dist; + if (t) + r->current_obj->solid->plane->cutted_obj[t->num] = cut->cutted_obj; + else + r->current_obj->solid->plane->cutted_obj[0] = cut->cutted_obj; +} + +static void change_dist_one(t_research *r, t_cut *cut) +{ + r->dist[0] = cut->final_dist; + r->current_obj = cut->cutted_obj; +} + +static void analyze_dist_p_n(t_research *r, t_cut *cut) +{ + if (cut->final_dist_p == 0 && cut->final_dist_n == 0) + return ; + else if (cut->final_dist_p > ACC && cut->final_dist_n > ACC + && cut->final_dist_p < cut->final_dist_n) + save_nothing(r, cut); + else if (cut->final_dist_p > ACC && cut->final_dist_n > ACC + && cut->final_dist_p > cut->final_dist_n) + select_special_case(r, cut); + else if (cut->final_dist_p == 0) + select_negative_case(r, cut); + else if (cut->final_dist_n == 0) + select_positive_case(r, cut); +} + +void save_dist(t_research *r, t_cut *cut, t_thread *t) +{ + analyze_dist_p_n(r, cut); + if (cut->final_dist == 0) + return ; + else if (cut->final_dist > r->dist[0]) + { + r->dist[1] = cut->final_dist; + r->dist[2] = cut->final_dist; + if (t) + r->current_obj->solid->plane->cutted_obj[t->num] = cut->cutted_obj; + else + r->current_obj->solid->plane->cutted_obj[0] = cut->cutted_obj; + } + else if (cut->final_dist > ACC && cut->final_dist < r->dist[0]) + change_dist_zero(r, cut, t); + else + change_dist_one(r, cut); +} diff --git a/src/cut_select_neg_or_pos.c b/src/cut_select_neg_or_pos.c new file mode 100644 index 0000000..93a2ff5 --- /dev/null +++ b/src/cut_select_neg_or_pos.c @@ -0,0 +1,42 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* cut_select_neg_or_pos.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 22:17:51 by ntrahy #+# #+# */ +/* Updated: 2017/01/02 22:30:04 by ntrahy ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void save_nothing(t_research *r, t_cut *cut) +{ + r->dist[0] = 0; + r->dist[1] = 0; + r->dist[2] = 0; + r->current_obj = cut->cutted_obj; + cut->final_dist = 0; +} + +void save_negative_plane(t_research *r, t_cut *cut) +{ + r->current_obj = cut->closest_negative; + r->modified_ray = cut->closest_negative_ray; + cut->final_dist = cut->final_dist_n; +} + +void save_positive_plane(t_research *r, t_cut *cut) +{ + r->current_obj = cut->closest_positive; + r->modified_ray = cut->closest_positive_ray; + cut->final_dist = cut->final_dist_p; +} + +void save_cutted_object(t_research *r, t_cut *cut) +{ + r->current_obj = cut->cutted_obj; + cut->final_dist = 0; +} diff --git a/src/cut_select_negative.c b/src/cut_select_negative.c new file mode 100644 index 0000000..8dd774c --- /dev/null +++ b/src/cut_select_negative.c @@ -0,0 +1,55 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* cut_select_negative.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 22:17:54 by ntrahy #+# #+# */ +/* Updated: 2017/01/02 22:17:55 by ntrahy ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +static void save_negative_case_cone(t_research *r, t_cut *cut) +{ + if ((cut->c_n.c1 && cut->c_n.p1 && cut->c_n.f) + || (cut->c_n.c1 && cut->c_n.p3 && cut->c_n.f) + || (cut->c_n.c2 && cut->c_n.p3 && cut->c_n.f) + || (cut->c_n.c3 && cut->c_n.p3 && cut->c_n.f) + || (cut->c_n.c4 && cut->c_n.p2 && cut->c_n.f) + || (cut->c_n.c5 && cut->c_n.p2 && cut->c_n.f)) + save_negative_plane(r, cut); + else if ((cut->c_n.c4 && cut->c_n.p3) + || (cut->c_n.c5 && cut->c_n.p3)) + save_nothing(r, cut); + else if ((cut->c_n.c1 && cut->c_n.p2) + || (cut->c_n.c2 && cut->c_n.p2 && cut->c_n.f)) + { + save_cutted_object(r, cut); + r->dist[2] = r->dist[1]; + } + else if (cut->c_n.c4 && cut->c_n.p1 && cut->c_n.f) + save_cutted_object(r, cut); +} + +static void save_negative_case(t_research *r, t_cut *cut) +{ + if ((cut->c_n.c1 && cut->c_n.p2 && cut->c_n.f) + || (cut->c_n.c2 && cut->c_n.p2 && cut->c_n.f)) + save_negative_plane(r, cut); + else if ((cut->c_n.c1 && cut->c_n.p3) + || (cut->c_n.c2 && cut->c_n.p3)) + save_nothing(r, cut); + else if (cut->c_n.c1 && cut->c_n.p1 && cut->c_n.f) + save_cutted_object(r, cut); +} + +void select_negative_case(t_research *r, t_cut *cut) +{ + if (cut->cutted_obj->type == CONE) + save_negative_case_cone(r, cut); + else + save_negative_case(r, cut); +} diff --git a/src/cut_select_positive.c b/src/cut_select_positive.c new file mode 100644 index 0000000..b6f8a74 --- /dev/null +++ b/src/cut_select_positive.c @@ -0,0 +1,58 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* cut_select_positive.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 22:31:17 by ntrahy #+# #+# */ +/* Updated: 2017/01/02 22:31:19 by ntrahy ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +static void save_positive_case_cone(t_research *r, t_cut *cut) +{ + if ((cut->c_p.c1 && cut->c_p.p1 && cut->c_p.f) + || (cut->c_p.c3 && cut->c_p.p3 && cut->c_p.f) + || (cut->c_p.c5 && cut->c_p.p2 && cut->c_p.f)) + save_positive_plane(r, cut); + else if ((cut->c_p.c1 && cut->c_p.b) + || (cut->c_p.c2 && cut->c_p.b) + || (cut->c_p.c2 && cut->c_p.f && cut->c_p.p2) + || (cut->c_p.c3 && cut->c_p.b) + || (cut->c_p.c4 && cut->c_p.b) + || (cut->c_p.c4 && cut->c_p.f && cut->c_p.p1) + || (cut->c_p.c5 && cut->c_p.b) + || (cut->c_p.c6 && cut->c_p.b)) + save_nothing(r, cut); + else if ((cut->c_p.c1 && cut->c_p.p2 && cut->c_p.f) + || (cut->c_p.c1 && cut->c_p.p3 && cut->c_p.f) + || (cut->c_p.c2 && cut->c_p.p3 && cut->c_p.f) + || (cut->c_p.c4 && cut->c_p.p1 && cut->c_p.f) + || (cut->c_p.c4 && cut->c_p.p3 && cut->c_p.f)) + save_cutted_object(r, cut); +} + +static void save_positive_case(t_research *r, t_cut *cut) +{ + if ((cut->c_p.c2 && cut->c_p.p2 && cut->c_p.f)) + save_positive_plane(r, cut); + if ((cut->c_p.c1 && cut->c_p.b) + || (cut->c_p.c1 && cut->c_p.f && cut->c_p.p1) + || (cut->c_p.c2 && cut->c_p.b) + || (cut->c_p.c3 && cut->c_p.b)) + save_nothing(r, cut); + if ((cut->c_p.c1 && cut->c_p.p1 && cut->c_p.f) + || (cut->c_p.c1 && cut->c_p.p3 && cut->c_p.f)) + save_cutted_object(r, cut); +} + +void select_positive_case(t_research *r, t_cut *cut) +{ + if (cut->cutted_obj->type == CONE) + save_positive_case_cone(r, cut); + else + save_positive_case(r, cut); +} diff --git a/src/cut_select_special.c b/src/cut_select_special.c new file mode 100644 index 0000000..661c6bf --- /dev/null +++ b/src/cut_select_special.c @@ -0,0 +1,36 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* cut_select_special.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 22:31:36 by ntrahy #+# #+# */ +/* Updated: 2017/01/08 14:56:08 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +static void save_special_case_cone(t_research *r, t_cut *cut) +{ + if ((cut->c_n.c1 && cut->c_n.p2 && cut->c_n.f) + || (cut->c_n.c2 && cut->c_n.p2 && cut->c_n.f) + || (cut->c_n.c4 && cut->c_n.p1 && cut->c_n.f)) + save_cutted_object(r, cut); + else + save_negative_plane(r, cut); +} + +void select_special_case(t_research *r, t_cut *cut) +{ + if (cut->cutted_obj->type == CONE) + save_special_case_cone(r, cut); + else + { + if ((cut->c_n.c1 && cut->c_n.p1 && cut->c_n.f)) + save_cutted_object(r, cut); + else + save_negative_plane(r, cut); + } +} diff --git a/src/display.c b/src/display.c new file mode 100644 index 0000000..5d520ff --- /dev/null +++ b/src/display.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* display.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/12/14 21:19:54 by ntrahy #+# #+# */ +/* Updated: 2016/12/14 21:20:06 by ntrahy ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void remake(t_data *d) +{ + raytracer(d); + mlx_clear_window(d->mlx, d->win); + mlx_put_image_to_window(d->mlx, d->win, d->img->img, 0, 0); + add_eblouissement(d); +} + +void display_again(t_data *d) +{ + mlx_clear_window(d->mlx, d->win); + mlx_put_image_to_window(d->mlx, d->win, d->img->img, 0, 0); +} + +void display_scenes(t_env *e) +{ + mlx_clear_window(e->mlx, e->win); + mlx_put_image_to_window(e->mlx, e->win, e->img_bg, 0, 0); + foreach_d_thumbnail(e); +} diff --git a/src/display_names.c b/src/display_names.c new file mode 100644 index 0000000..32edd73 --- /dev/null +++ b/src/display_names.c @@ -0,0 +1,48 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* display_names.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/09 16:57:26 by ntrahy #+# #+# */ +/* Updated: 2017/01/11 13:00:36 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void print_page_string(t_env *e) +{ + char *str; + char *tmp; + + if (!(str = (char *)ft_memalloc(sizeof(char) * 15))) + ft_malloc_error(); + str = ft_strcat(str, "Page : "); + tmp = ft_itoa(e->page + 1); + str = ft_strcat(str, tmp); + free(tmp); + str = ft_strcat(str, " / "); + tmp = ft_itoa(e->page_m); + str = ft_strcat(str, tmp); + mlx_string_put(e->mlx, e->win, 10, 10, 0xFFFFFF, str); + free(tmp); + free(str); +} + +char *get_scene_name(int nb, char *name) +{ + char *str; + char *tmp; + + if (!(str = (char *)malloc(sizeof(char) * 18))) + ft_malloc_error(); + ft_bzero(str, 18); + tmp = ft_itoa(nb + 1); + ft_strcat(str, tmp); + free(tmp); + ft_strcat(str, ". "); + ft_strncat(str, name, 14); + return (str); +} diff --git a/src/display_scene_tmb.c b/src/display_scene_tmb.c new file mode 100644 index 0000000..3eaba4a --- /dev/null +++ b/src/display_scene_tmb.c @@ -0,0 +1,73 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* display_scene_tmb.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/03 03:19:22 by ntrahy #+# #+# */ +/* Updated: 2017/01/11 13:01:29 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +static void print_thmb_nb(t_data *d, int nb, char *name) +{ + static int x[3] = {80, 380, 680}; + static int y[2] = {100, 350}; + unsigned int i; + unsigned int j; + char *str; + + i = x[nb % 3]; + j = y[nb / 3]; + str = get_scene_name(nb, name); + mlx_put_image_to_window(d->mlx, d->win, d->img->img, i, j); + mlx_string_put(d->mlx, d->win, i + 10, j + 180, 0xFFFFFF, str); + free(str); +} + +void dirty_override(t_data *d) +{ + double aa; + double dp; + + aa = d->aa_lvl; + dp = d->dpp; + d->aa_lvl = 1; + d->dpp = 1; + raytracer(d); + d->aa_lvl = aa; + d->dpp = dp; +} + +static t_scene *get_list_from_page(t_scene *lst, int p) +{ + int cpt; + t_scene *tmp; + + tmp = lst; + cpt = 0; + while (tmp && (cpt++ / 6 < p)) + tmp = tmp->next; + return (tmp); +} + +void foreach_d_thumbnail(t_env *e) +{ + t_scene *tmp; + int cpt; + + cpt = 0; + print_page_string(e); + tmp = get_list_from_page(e->lst_scene, e->page); + while (tmp && cpt < 6) + { + if ((tmp->d->tld == 0) ? tmp->d->tld = 1 : 0) + dirty_override(tmp->d); + print_thmb_nb(tmp->d, cpt, tmp->name); + cpt++; + tmp = tmp->next; + } +} diff --git a/src/events_menu.c b/src/events_menu.c new file mode 100644 index 0000000..3860a83 --- /dev/null +++ b/src/events_menu.c @@ -0,0 +1,62 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* events_menu.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 23:20:01 by ntrahy #+# #+# */ +/* Updated: 2017/01/11 13:18:28 by ntrahy ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void page_manager(t_env *e, int k) +{ + if (k == KEY_LEFT && e->page > 0) + { + e->page--; + display_scenes(e); + } + if (k == KEY_RIGHT && e->page + 1 < e->page_m) + { + e->page++; + display_scenes(e); + } +} + +int events_key_menu(int keycode, t_env *e) +{ + if (!e->lst_scene) + { + if (keycode == KEY_ENTER) + { + e->loading = 1; + mlx_put_image_to_window(e->mlx, e->win, e->img_loading, 0, 0); + } + } + else if (e->lst_scene) + { + if (keycode >= 83 && keycode <= 88) + if (select_scene(e, keycode - 83)) + { + e->rendering = 1; + mlx_clear_window(e->mlx, e->win); + mlx_put_image_to_window(e->mlx, e->win, e->img_rendering, 0, 0); + } + if (keycode == KEY_LEFT || keycode == KEY_RIGHT) + page_manager(e, keycode); + } + return (0); +} + +int events_mouse_menu(int button, int x, int y, t_env *e) +{ + if (!e->butt_lst) + e->butt_lst = init_butt(); + if (e->lst_scene && e->butt_lst && button == 1) + if (select_scene(e, clic_scene(e, x, y))) + remake(e->current_scene); + return (0); +} diff --git a/src/events_redirect.c b/src/events_redirect.c new file mode 100644 index 0000000..ca418d7 --- /dev/null +++ b/src/events_redirect.c @@ -0,0 +1,66 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* events_redirect.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 23:20:08 by ntrahy #+# #+# */ +/* Updated: 2017/01/11 13:57:28 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +int ft_close_cross(t_env *e) +{ + free_env(e); + ft_putstr("Program closed successfully\n"); + exit(0); +} + +int events_mouse(int button, int x, int y, t_env *e) +{ + if (x >= 0 && y >= 0 && x <= WIDTH && y <= HEIGHT) + { + if (e->in_menu == 0) + events_mouse_scene(button, x, y, e->current_scene); + else + events_mouse_menu(button, x, y, e); + } + return (0); +} + +void back_to_the_menu(t_env *e) +{ + mlx_clear_window(e->mlx, e->win); + free_img(e->mlx, e->current_scene->img); + free(e->current_scene); + e->current_scene = NULL; + e->in_menu = 1; + display_scenes(e); +} + +int events_key(int keycode, t_env *e) +{ + if (keycode == KEY_ESC) + ft_close_cross(e); + else if (keycode == KEY_F2) + reload_env(e); + else if (e->in_menu == 1) + events_key_menu(keycode, e); + else + { + if (keycode == 82 || keycode == KEY_BACKSPACE) + back_to_the_menu(e); + events_key_scene(keycode, e->current_scene); + if (keycode == KEY_H) + { + e->cmd = (e->cmd == 1) ? 0 : 1; + display_again(e->current_scene); + if (e->cmd) + mlx_put_image_to_window(e->mlx, e->win, e->img_cmd, 0, 440); + } + } + return (0); +} diff --git a/src/events_scene.c b/src/events_scene.c new file mode 100644 index 0000000..5f6701c --- /dev/null +++ b/src/events_scene.c @@ -0,0 +1,112 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* events_scene.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/12/20 18:55:33 by scebula #+# #+# */ +/* Updated: 2017/01/11 13:55:47 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +static void events_key_scene2(int keycode, t_data *d) +{ + if (keycode == KEY_UP) + event_mov_look_up(d); + if (keycode == KEY_DOWN) + event_mov_look_down(d); + if (keycode == KEY_R) + event_mov_up(d); + if (keycode == KEY_F) + event_mov_dwn(d); + if (keycode == 50) + add_eblouissement(d); +} + +int events_key_scene(int keycode, t_data *d) +{ + if (keycode == KEY_SPACE) + remake(d); + if (keycode == KEY_P) + display_again(d); + if (keycode >= KEY_1 && keycode <= KEY_4) + img_recolor(d, (int (*)(t_color c))d->func->post_pro[keycode - KEY_1]); + if (keycode == KEY_W) + event_mov_fwd(d); + if (keycode == KEY_S) + event_mov_bwd(d); + if (keycode == KEY_A) + event_mov_strafe_lft(d); + if (keycode == KEY_D) + event_mov_strafe_rgt(d); + if (keycode == KEY_LEFT) + event_mov_look_left(d); + if (keycode == KEY_RIGHT) + event_mov_look_right(d); + events_key_scene2(keycode, d); + return (0); +} + +char *display_object_stats(t_data *d, t_obj *hitted_obj) +{ + char *str; + static char *type[10] = {"Zero", "Sphere", "Plane", "Cylinder", "Cone", + "Triangle", "Prism", "Cube", "Paraboloid", "Hyperboloid"}; + + (void)(d); + if (!(str = ft_strnew(20))) + ft_malloc_error(); + str = ft_strcat(str, "Type :"); + str = ft_strcat(str, type[hitted_obj->type + 1]); + return (str); +} + +t_obj *find_hit(t_ray ray, t_data *d, t_thread *thread) +{ + t_research r; + t_obj *tmp_current; + + init_var(&r, ray); + r.current_obj = d->obj; + while (r.current_obj) + { + tmp_current = r.current_obj; + r.modified_ray = ray; + find_n_dist(&r, d, thread); + if ((r.dist[2] > r.final_dist && r.final_dist == 0 + && r.dist[2] > ACC) || (r.dist[2] < r.final_dist && + r.final_dist > 0 && r.dist[2] > ACC)) + { + r.final_dist = r.dist[2]; + r.closest_obj = r.current_obj; + r.final_ray = r.modified_ray; + } + if (tmp_current->next == NULL && r.final_dist > ACC) + return (r.closest_obj); + r.current_obj = tmp_current->next; + } + return (NULL); +} + +int events_mouse_scene(int button, int x, int y, t_data *d) +{ + t_obj *hit_obj; + char *str; + + hit_obj = NULL; + str = NULL; + display_again(d); + if (button == 1) + { + if ((hit_obj = find_hit(calculate_ray(d, x, y, NULL), d, NULL))) + { + str = display_object_stats(d, hit_obj); + mlx_string_put(d->mlx, d->win, 6, 6, 0xFFFFFF, str); + mlx_string_put(d->mlx, d->win, 5, 5, 0xFFFFFF, str); + } + } + return (1); +} diff --git a/src/events_scene_look.c b/src/events_scene_look.c new file mode 100644 index 0000000..549c7b7 --- /dev/null +++ b/src/events_scene_look.c @@ -0,0 +1,55 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* events_scene_look.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/08 12:15:48 by scebula #+# #+# */ +/* Updated: 2017/01/08 16:21:43 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void event_mov_look_left(t_data *d) +{ + t_matrix xyz; + + xyz = init_xyzrotation_matrix(10, d->cam.up.x, d->cam.up.y, d->cam.up.z); + apply_matrix(xyz, &d->cam.dir); + create_cam(&d->cam, d); + remake(d); +} + +void event_mov_look_right(t_data *d) +{ + t_matrix xyz; + + xyz = init_xyzrotation_matrix(-10, d->cam.up.x, d->cam.up.y, d->cam.up.z); + apply_matrix(xyz, &d->cam.dir); + create_cam(&d->cam, d); + remake(d); +} + +void event_mov_look_up(t_data *d) +{ + t_matrix xyz; + + xyz = init_xyzrotation_matrix(-10, d->cam.left.x, d->cam.left.y, + d->cam.left.z); + apply_matrix(xyz, &d->cam.dir); + create_cam(&d->cam, d); + remake(d); +} + +void event_mov_look_down(t_data *d) +{ + t_matrix xyz; + + xyz = init_xyzrotation_matrix(10, d->cam.left.x, d->cam.left.y, + d->cam.left.z); + apply_matrix(xyz, &d->cam.dir); + create_cam(&d->cam, d); + remake(d); +} diff --git a/src/events_scene_movement.c b/src/events_scene_movement.c new file mode 100644 index 0000000..4f5c11b --- /dev/null +++ b/src/events_scene_movement.c @@ -0,0 +1,45 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* events_scene_movement.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 23:20:23 by ntrahy #+# #+# */ +/* Updated: 2017/01/08 12:17:53 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void event_mov_fwd(t_data *d) +{ + normalize_vector(&d->cam.dir); + add_to_vector(&(d->cam.pos), (d->cam.dir)); + create_cam(&d->cam, d); + remake(d); +} + +void event_mov_bwd(t_data *d) +{ + normalize_vector(&d->cam.dir); + substract_to_vector(&(d->cam.pos), (d->cam.dir)); + create_cam(&d->cam, d); + remake(d); +} + +void event_mov_strafe_lft(t_data *d) +{ + normalize_vector(&d->cam.dir); + add_to_vector(&(d->cam.pos), (d->cam.left)); + create_cam(&d->cam, d); + remake(d); +} + +void event_mov_strafe_rgt(t_data *d) +{ + normalize_vector(&d->cam.dir); + substract_to_vector(&(d->cam.pos), (d->cam.left)); + create_cam(&d->cam, d); + remake(d); +} diff --git a/src/events_scene_movement_up_down.c b/src/events_scene_movement_up_down.c new file mode 100644 index 0000000..2b27cd8 --- /dev/null +++ b/src/events_scene_movement_up_down.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* events_scene_movement_up_down.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/08 12:17:09 by scebula #+# #+# */ +/* Updated: 2017/01/08 12:17:55 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void event_mov_dwn(t_data *d) +{ + normalize_vector(&d->cam.dir); + substract_to_vector(&(d->cam.pos), init_vector(0, 1, 0, 1)); + create_cam(&d->cam, d); + remake(d); +} + +void event_mov_up(t_data *d) +{ + normalize_vector(&d->cam.dir); + add_to_vector(&(d->cam.pos), init_vector(0, 1, 0, 1)); + create_cam(&d->cam, d); + remake(d); +} diff --git a/src/events_select_scene.c b/src/events_select_scene.c new file mode 100644 index 0000000..2f3bf32 --- /dev/null +++ b/src/events_select_scene.c @@ -0,0 +1,86 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* event_select_scene.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 22:37:48 by ntrahy #+# #+# */ +/* Updated: 2017/01/07 14:32:15 by gbrochar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void init_data_zero(t_data *d) +{ + d->mlx = NULL; + d->win = NULL; + d->img = NULL; + d->obj = NULL; + d->texturelist = NULL; + d->light_list = NULL; + d->func = NULL; + d->width = WIDTH; + d->height = HEIGHT; + d->x = 0; + d->y = 0; + d->ambient = 0.2; + d->aa_lvl = 1; + d->dpp = 1; + d->cam.pos = (t_vect){0, 0.0000000001, 7, 1}; + d->reflections = REFLECTIONS; +} + +t_data *copy_scene(t_scene *src) +{ + t_data *d; + + d = (t_data *)ft_memalloc(sizeof(t_data)); + init_data_zero(d); + d = ft_memcpy(d, src->d, sizeof(t_data)); + d->width = WIDTH; + d->height = HEIGHT; + d->img = init_img(d->mlx, d->width, d->height); + create_cam(&(d->cam), d); + return (d); +} + +int select_scene(t_env *e, int k) +{ + t_scene *tmp; + int cpt; + + if (k >= 0 && k < 6 && k < e->lst_size) + { + k = k + 6 * e->page; + if (k >= e->lst_size) + return (0); + tmp = e->lst_scene; + cpt = 0; + while (tmp && cpt < k) + { + tmp = tmp->next; + cpt++; + } + e->current_scene = copy_scene(tmp); + e->in_menu = 0; + return (1); + } + return (0); +} + +int clic_scene(t_env *e, int x, int y) +{ + t_butt *tmp; + + tmp = e->butt_lst; + while (tmp) + { + if (x >= tmp->xmin && x <= tmp->xmax) + if (y >= tmp->ymin && y <= tmp->ymax) + return (tmp->moon); + tmp = tmp->next; + } + return (-1); +} diff --git a/src/free_functions.c b/src/free_functions.c new file mode 100644 index 0000000..30c1946 --- /dev/null +++ b/src/free_functions.c @@ -0,0 +1,91 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* free_functions.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/11/23 04:54:21 by ntrahy #+# #+# */ +/* Updated: 2017/01/09 20:36:54 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +static t_func *free_function(void **f) +{ + if (f) + free(f); + f = NULL; + return (NULL); +} + +static t_func *free_func_lst(t_func *func) +{ + if (func) + { + free_function(func->get_obj_tf_list); + free_function(func->get_obj_normal); + free_function(func->get_obj_color); + free_function(func->get_obj_n); + free_function((void **)func->post_pro); + free(func); + func = NULL; + } + return (NULL); +} + +t_obj *free_obj(t_obj **begin_light_list) +{ + t_obj *tmp; + t_obj *next_tmp; + + tmp = *begin_light_list; + next_tmp = NULL; + while (tmp) + { + next_tmp = tmp->next; + select_free_obj(tmp); + free(tmp->solid); + tmp->solid = NULL; + free(tmp); + tmp = next_tmp; + } + *begin_light_list = NULL; + return (NULL); +} + +void free_scene_list(t_scene *s) +{ + t_scene *tmp_0; + t_scene *tmp_1; + + tmp_0 = s; + if (tmp_0) + while (tmp_0) + { + tmp_1 = tmp_0->next; + free_data(tmp_0->d); + free(tmp_0); + tmp_0 = tmp_1; + } +} + +void free_data(t_data *d) +{ + if (d) + { + if (d->light_list) + free_light_list(&(d->light_list)); + if (d->obj) + free_obj(&(d->obj)); + if (d->func) + free_func_lst(d->func); + if (d->texturelist) + free_texture(d->mlx, d->texturelist); + if (d->img) + free_img(d->mlx, d->img); + free(d); + d = NULL; + } +} diff --git a/src/ft_error.c b/src/ft_error.c new file mode 100644 index 0000000..c67962c --- /dev/null +++ b/src/ft_error.c @@ -0,0 +1,40 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_error.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/11/23 04:54:32 by ntrahy #+# #+# */ +/* Updated: 2016/11/23 04:54:35 by ntrahy ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void ft_malloc_error(void) +{ + write(2, "Malloc error. Program will now close.\n", 38); + exit(0); +} + +void ft_parsing_error(int linenbr, char *line, char *filename) +{ + ft_putstr("Error at line "); + ft_putnbr(linenbr); + if (filename != NULL) + { + ft_putstr(" of "); + ft_putstr(filename); + } + ft_putstr(": "); + ft_putendl(line); + write(2, "Error parsing file. Use a valid file\n", 37); + exit(0); +} + +void ft_error(void) +{ + write(2, "Program encountered a fatal error.\n", 35); + exit(0); +} diff --git a/src/get_list_from_page.c b/src/get_list_from_page.c new file mode 100644 index 0000000..388ba75 --- /dev/null +++ b/src/get_list_from_page.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_list_from_page.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/08 12:12:14 by scebula #+# #+# */ +/* Updated: 2017/01/08 12:12:17 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +t_scene *get_list_from_page(t_scene *lst, int p) +{ + int cpt; + t_scene *tmp; + + tmp = lst; + cpt = 0; + while (tmp && (cpt++ / 6 < p)) + tmp = tmp->next; + return (tmp); +} diff --git a/src/get_obj_color.c b/src/get_obj_color.c new file mode 100644 index 0000000..739219c --- /dev/null +++ b/src/get_obj_color.c @@ -0,0 +1,33 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_obj_color.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/10/01 15:46:16 by scebula #+# #+# */ +/* Updated: 2017/01/03 12:24:25 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +t_color get_cylinder_color(t_obj *obj) +{ + return (TO_CYLINDER->color); +} + +t_color get_sphere_color(t_obj *obj) +{ + return (TO_SPHERE->color); +} + +t_color get_plane_color(t_obj *obj) +{ + return (TO_PLANE->color); +} + +t_color get_cone_color(t_obj *obj) +{ + return (TO_CONE->color); +} diff --git a/src/get_obj_color_bis.c b/src/get_obj_color_bis.c new file mode 100644 index 0000000..a8c147b --- /dev/null +++ b/src/get_obj_color_bis.c @@ -0,0 +1,38 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_obj_color_bis.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/07 15:03:01 by ntrahy #+# #+# */ +/* Updated: 2017/01/07 15:41:40 by ntrahy ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +t_color get_triangle_color(t_obj *obj) +{ + return (TO_TRIANGLE->color); +} + +t_color get_prism_color(t_obj *obj) +{ + return (TO_PRISM->color); +} + +t_color get_cube_color(t_obj *obj) +{ + return (TO_CUBE->color); +} + +t_color get_paraboloid_color(t_obj *obj) +{ + return (TO_PARABOLOID->color); +} + +t_color get_hyperboloid_color(t_obj *obj) +{ + return (TO_HYPERBOLOID->color); +} diff --git a/src/get_obj_normal.c b/src/get_obj_normal.c new file mode 100644 index 0000000..549419f --- /dev/null +++ b/src/get_obj_normal.c @@ -0,0 +1,50 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_obj_normal.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/10/01 15:46:51 by scebula #+# #+# */ +/* Updated: 2017/01/03 12:25:22 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +t_vect get_cylinder_normal(t_obj *obj, t_vect n, t_thread *thread) +{ + (void)obj; + (void)thread; + n.y = 0; + normalize_vector(&n); + n.w = 0; + return (n); +} + +t_vect get_sphere_normal(t_obj *obj, t_vect n, t_thread *thread) +{ + (void)thread; + (void)obj; + normalize_vector(&n); + n.w = 0; + return (n); +} + +t_vect get_plane_normal(t_obj *obj, t_vect n, t_thread *thread) +{ + (void)thread; + (void)n; + return (TO_PLANE->normal); +} + +t_vect get_cone_normal(t_obj *obj, t_vect n, t_thread *thread) +{ + t_vect normal; + + (void)thread; + normal = init_vector(2 * n.x, -2 * TO_CONE->tan_alpha * + n.y, 2 * n.z, 0); + normalize_vector(&normal); + return (normal); +} diff --git a/src/get_obj_normal_bis.c b/src/get_obj_normal_bis.c new file mode 100644 index 0000000..85738aa --- /dev/null +++ b/src/get_obj_normal_bis.c @@ -0,0 +1,60 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_obj_normal_bis.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/07 15:08:07 by ntrahy #+# #+# */ +/* Updated: 2017/01/07 15:42:06 by ntrahy ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +t_vect get_triangle_normal(t_obj *obj, t_vect n, t_thread *thread) +{ + (void)thread; + (void)n; + return (TO_TRIANGLE->normal); +} + +t_vect get_prism_normal(t_obj *obj, t_vect n, t_thread *thread) +{ + int i; + + (void)n; + i = TO_PRISM->closest_triangle[thread->num]; + return (TO_PRISM->triangle[i]->solid->triangle->normal); +} + +t_vect get_cube_normal(t_obj *obj, t_vect n, t_thread *thread) +{ + int i; + + (void)n; + i = TO_CUBE->closest_triangle[thread->num]; + return (TO_CUBE->triangle[i]->solid->triangle->normal); +} + +t_vect get_paraboloid_normal(t_obj *obj, t_vect n, t_thread *thread) +{ + t_vect normal; + + (void)obj; + (void)thread; + normal = init_vector(2 * n.x, 0, 2 * n.z, 0); + normalize_vector(&normal); + return (normal); +} + +t_vect get_hyperboloid_normal(t_obj *obj, t_vect n, t_thread *thread) +{ + t_vect normal; + + (void)obj; + (void)thread; + normal = init_vector(2 * n.x, -2 * n.y, 2 * n.z, 0); + normalize_vector(&normal); + return (normal); +} diff --git a/src/get_obj_tf_list.c b/src/get_obj_tf_list.c new file mode 100644 index 0000000..7a8a0fb --- /dev/null +++ b/src/get_obj_tf_list.c @@ -0,0 +1,38 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_obj_tf_list.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/10/01 15:47:04 by scebula #+# #+# */ +/* Updated: 2017/01/08 12:23:30 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +t_tf_list *get_cylinder_tf_list(t_obj *obj) +{ + return (TO_CYLINDER->tf_list); +} + +t_tf_list *get_sphere_tf_list(t_obj *obj) +{ + return (TO_SPHERE->tf_list); +} + +t_tf_list *get_plane_tf_list(t_obj *obj) +{ + return (TO_PLANE->tf_list); +} + +t_tf_list *get_cone_tf_list(t_obj *obj) +{ + return (TO_CONE->tf_list); +} + +t_tf_list *get_triangle_tf_list(t_obj *obj) +{ + return (TO_TRIANGLE->tf_list); +} diff --git a/src/get_obj_tf_list_complex.c b/src/get_obj_tf_list_complex.c new file mode 100644 index 0000000..0900647 --- /dev/null +++ b/src/get_obj_tf_list_complex.c @@ -0,0 +1,33 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_obj_tf_list_complex.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/08 12:23:27 by scebula #+# #+# */ +/* Updated: 2017/01/08 12:23:39 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +t_tf_list *get_prism_tf_list(t_obj *obj) +{ + return (TO_PRISM->tf_list); +} + +t_tf_list *get_cube_tf_list(t_obj *obj) +{ + return (TO_CUBE->tf_list); +} + +t_tf_list *get_paraboloid_tf_list(t_obj *obj) +{ + return (TO_PARABOLOID->tf_list); +} + +t_tf_list *get_hyperboloid_tf_list(t_obj *obj) +{ + return (TO_HYPERBOLOID->tf_list); +} diff --git a/src/init_button.c b/src/init_button.c new file mode 100644 index 0000000..6484f5f --- /dev/null +++ b/src/init_button.c @@ -0,0 +1,59 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* init_button.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/12/15 04:12:56 by ntrahy #+# #+# */ +/* Updated: 2017/01/05 13:56:08 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +t_butt *new_butt(int nb, int xmin, int ymin) +{ + t_butt *new; + + new = (t_butt*)ft_memalloc(sizeof(t_butt)); + new->xmin = xmin; + new->xmax = xmin + 275; + new->ymin = ymin; + new->ymax = ymin + 200; + new->moon = nb; + new->next = NULL; + return (new); +} + +void butt_pushback(t_butt **alst, t_butt *new) +{ + t_butt *tmp; + + if (!(*alst)) + *alst = new; + else + { + tmp = *alst; + while (tmp->next) + tmp = tmp->next; + tmp->next = new; + } +} + +t_butt *init_butt(void) +{ + t_butt *moon; + static int x[6] = {80, 380, 680, 80, 380, 680}; + static int y[6] = {100, 100, 100, 350, 350, 350}; + int pone; + + pone = 0; + moon = NULL; + while (pone < 6) + { + butt_pushback(&moon, new_butt(pone, x[pone], y[pone])); + pone++; + } + return (moon); +} diff --git a/src/init_camera.c b/src/init_camera.c new file mode 100644 index 0000000..93196bd --- /dev/null +++ b/src/init_camera.c @@ -0,0 +1,47 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* init_camera.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/11/23 04:55:58 by ntrahy #+# #+# */ +/* Updated: 2016/12/20 21:05:52 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +static t_vect get_first_pix_dir(t_cam cam) +{ + t_vect first_pixel_pos; + t_vect first_pixel_dir; + + mult_vector(&cam.dir, cam.cam_plane_dist); + mult_vector(&cam.up, cam.plane_height / 2.0); + mult_vector(&cam.left, cam.plane_width / 2.0); + first_pixel_pos = cam.pos; + add_to_vector(&first_pixel_pos, cam.dir); + add_to_vector(&first_pixel_pos, cam.up); + add_to_vector(&first_pixel_pos, cam.left); + first_pixel_dir = init_vector(first_pixel_pos.x - cam.pos.x, + first_pixel_pos.y - cam.pos.y, first_pixel_pos.z - cam.pos.z, 0); + normalize_vector(&first_pixel_dir); + return (first_pixel_dir); +} + +void create_cam(t_cam *cam, t_data *d) +{ + t_vect dir; + + normalize_vector(&(cam->dir)); + cam->cam_plane_dist = 1; + cam->plane_width = 1; + cam->plane_height = (double)d->height / (double)d->width; + cam->up = init_vector(0, 1, 0, 0); + dir = cam->dir; + negative_vector(&dir); + cam->left = cross_product_vector(dir, cam->up); + cam->up = cross_product_vector(cam->left, dir); + cam->first_pixel_dir = get_first_pix_dir(*cam); +} diff --git a/src/init_cut_condition.c b/src/init_cut_condition.c new file mode 100644 index 0000000..496d526 --- /dev/null +++ b/src/init_cut_condition.c @@ -0,0 +1,43 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* init_cut_condition.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 23:15:37 by ntrahy #+# #+# */ +/* Updated: 2017/01/02 23:15:39 by ntrahy ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void init_cut_condition_cone(t_research *r, t_cut *cut) +{ + cut->c.c1 = (r->dist[0] > ACC && r->dist[1] > ACC && cut->c.in); + cut->c.c2 = (r->dist[0] < 0 && r->dist[1] > ACC && !cut->c.in); + cut->c.c3 = (r->dist[0] < 0 && r->dist[1] < 0 && cut->c.in); + cut->c.c4 = (r->dist[0] > ACC && r->dist[1] > ACC && !cut->c.in); + cut->c.c5 = (r->dist[0] < 0 && r->dist[1] > ACC && cut->c.in); + cut->c.c6 = (r->dist[0] < 0 && r->dist[1] < 0 && !cut->c.in); + cut->c.f = cut->plane[2] > ACC; + cut->c.b = cut->plane[2] < 0; + cut->c.p1 = cut->plane[2] < r->dist[0]; + cut->c.p2 = cut->plane[2] > r->dist[0] && cut->plane[2] < r->dist[1]; + cut->c.p3 = cut->plane[2] > r->dist[1]; +} + +void init_cut_condition_others(t_research *r, t_cut *cut) +{ + cut->c.c1 = (r->dist[0] > ACC && r->dist[1] > ACC); + cut->c.c2 = (r->dist[0] < 0 && r->dist[1] > ACC); + cut->c.c3 = (r->dist[0] < 0 && r->dist[1] < 0); + cut->c.c4 = 0; + cut->c.c5 = 0; + cut->c.c6 = 0; + cut->c.f = cut->plane[2] > ACC; + cut->c.b = cut->plane[2] < 0; + cut->c.p1 = cut->plane[2] < r->dist[0]; + cut->c.p2 = cut->plane[2] > r->dist[0] && cut->plane[2] < r->dist[1]; + cut->c.p3 = cut->plane[2] > r->dist[1]; +} diff --git a/src/init_env.c b/src/init_env.c new file mode 100644 index 0000000..77127fd --- /dev/null +++ b/src/init_env.c @@ -0,0 +1,100 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* init_env.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 23:16:09 by ntrahy #+# #+# */ +/* Updated: 2017/01/11 13:03:13 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void env_bzero(t_env *e) +{ + e->lst_scene = NULL; + e->current_scene = NULL; + e->page = 0; + e->page_m = 0; + e->lst_size = 0; + e->in_menu = 1; + e->butt_lst = NULL; + e->w = WIDTH; + e->h = HEIGHT; + e->rendering = 0; + e->loading = 0; + e->cmd = 0; +} + +t_env *init_env(void) +{ + t_env *e; + + e = (t_env *)malloc(sizeof(t_env)); + env_bzero(e); + e->mlx = NULL; + e->win = NULL; + if ((e->mlx = mlx_init()) == NULL) + ft_malloc_error(); + if ((e->win = mlx_new_window(e->mlx, e->w, e->h, "RT")) == NULL) + ft_malloc_error(); + if ((!(e->img_bg = mlx_xpm_file_to_image(e->mlx, "xpm/plainBG.xpm", + &e->w, &e->h))) || + (!(e->img_wel = mlx_xpm_file_to_image(e->mlx, "xpm/welcome.xpm", + &e->w, &e->h))) || + (!(e->img_rendering = mlx_xpm_file_to_image(e->mlx, "xpm/rend.xpm", + &e->w, &e->h))) || + (!(e->img_loading = mlx_xpm_file_to_image(e->mlx, "xpm/loading.xpm", + &e->w, &e->h))) || + (!(e->img_cmd = mlx_xpm_file_to_image(e->mlx, "xpm/cmd.xpm", + &e->w, &e->h)))) + ft_error(); + return (e); +} + +void reload_env(t_env *e) +{ + if (e->lst_scene) + free_scene_list(e->lst_scene); + if (e->current_scene) + free(e->current_scene); + if (e->butt_lst) + free_butt(e->butt_lst); + env_bzero(e); + welcome_to_rt(e); +} + +void free_butt(t_butt *b) +{ + t_butt *tmp_0; + t_butt *tmp_1; + + tmp_0 = b; + if (tmp_0) + while (tmp_0) + { + tmp_1 = tmp_0->next; + free(tmp_0); + tmp_0 = tmp_1; + } +} + +void free_env(t_env *e) +{ + if (e) + { + if (e->lst_scene) + free_scene_list(e->lst_scene); + if (e->current_scene) + { + free_img(e->mlx, e->current_scene->img); + free(e->current_scene); + } + if (e->butt_lst) + free_butt(e->butt_lst); + free(e); + e = NULL; + } +} diff --git a/src/init_function.c b/src/init_function.c new file mode 100644 index 0000000..2197882 --- /dev/null +++ b/src/init_function.c @@ -0,0 +1,98 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* init_function.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/11/23 04:56:13 by ntrahy #+# #+# */ +/* Updated: 2017/01/05 14:04:11 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +static void **init_get_obj_tf_list(void) +{ + void **get_obj_tf_list; + + get_obj_tf_list = (void **)ft_memalloc(sizeof(void *) * OBJECT_NUMBER); + get_obj_tf_list[CYLINDER] = (void *)get_cylinder_tf_list; + get_obj_tf_list[SPHERE] = (void *)get_sphere_tf_list; + get_obj_tf_list[PLANE] = (void *)get_plane_tf_list; + get_obj_tf_list[CONE] = (void *)get_cone_tf_list; + get_obj_tf_list[TRIANGLE] = (void *)get_triangle_tf_list; + get_obj_tf_list[PRISM] = (void *)get_prism_tf_list; + get_obj_tf_list[CUBE] = (void *)get_cube_tf_list; + get_obj_tf_list[PARABOLOID] = (void *)get_paraboloid_tf_list; + get_obj_tf_list[HYPERBOLOID] = (void *)get_hyperboloid_tf_list; + get_obj_tf_list[CSG] = NULL; + return (get_obj_tf_list); +} + +static void **init_get_obj_normal(void) +{ + void **get_obj_normal; + + get_obj_normal = (void **)ft_memalloc(sizeof(void *) * OBJECT_NUMBER); + get_obj_normal[CYLINDER] = (void *)get_cylinder_normal; + get_obj_normal[SPHERE] = (void *)get_sphere_normal; + get_obj_normal[PLANE] = (void *)get_plane_normal; + get_obj_normal[CONE] = (void *)get_cone_normal; + get_obj_normal[TRIANGLE] = (void *)get_triangle_normal; + get_obj_normal[PRISM] = (void *)get_prism_normal; + get_obj_normal[CUBE] = (void *)get_cube_normal; + get_obj_normal[PARABOLOID] = (void *)get_paraboloid_normal; + get_obj_normal[HYPERBOLOID] = (void *)get_hyperboloid_normal; + get_obj_normal[CSG] = NULL; + return (get_obj_normal); +} + +static void **init_get_obj_color(void) +{ + void **get_obj_color; + + get_obj_color = (void **)ft_memalloc(sizeof(void *) * OBJECT_NUMBER); + get_obj_color[CYLINDER] = (void *)get_cylinder_color; + get_obj_color[SPHERE] = (void *)get_sphere_color; + get_obj_color[PLANE] = (void *)get_plane_color; + get_obj_color[CONE] = (void *)get_cone_color; + get_obj_color[TRIANGLE] = (void *)get_triangle_color; + get_obj_color[PRISM] = (void *)get_prism_color; + get_obj_color[CUBE] = (void *)get_cube_color; + get_obj_color[PARABOLOID] = (void *)get_paraboloid_color; + get_obj_color[HYPERBOLOID] = (void *)get_hyperboloid_color; + get_obj_color[CSG] = NULL; + return (get_obj_color); +} + +static void **init_get_obj_n(void) +{ + void **get_obj_n; + + get_obj_n = (void **)ft_memalloc(sizeof(void *) * OBJECT_NUMBER); + get_obj_n[CYLINDER] = (void *)get_cylinder_n; + get_obj_n[SPHERE] = (void *)get_sphere_n; + get_obj_n[PLANE] = (void *)get_plane_n; + get_obj_n[CONE] = (void *)get_cone_n; + get_obj_n[TRIANGLE] = (void *)get_triangle_n; + get_obj_n[PRISM] = (void *)get_prism_n; + get_obj_n[CUBE] = (void *)get_cube_n; + get_obj_n[PARABOLOID] = (void *)get_paraboloid_n; + get_obj_n[HYPERBOLOID] = (void *)get_hyperboloid_n; + get_obj_n[CSG] = NULL; + return (get_obj_n); +} + +t_func *init_function(void) +{ + t_func *func; + + func = (t_func *)ft_memalloc(sizeof(t_func)); + func->get_obj_tf_list = init_get_obj_tf_list(); + func->get_obj_normal = init_get_obj_normal(); + func->get_obj_color = init_get_obj_color(); + func->get_obj_n = init_get_obj_n(); + func->post_pro = init_post_pro(); + return (func); +} diff --git a/src/init_img.c b/src/init_img.c new file mode 100644 index 0000000..55b9fd1 --- /dev/null +++ b/src/init_img.c @@ -0,0 +1,47 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* init_img.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/11/23 04:56:29 by ntrahy #+# #+# */ +/* Updated: 2017/01/05 14:02:37 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +static void init_img_zero(t_img *img) +{ + img->img = NULL; + img->data = NULL; +} + +t_img *free_img(void *mlx, t_img *img) +{ + if (img) + { + if (img->img) + mlx_destroy_image(mlx, img->img); + free(img); + img = NULL; + } + return (NULL); +} + +t_img *init_img(void *mlx, int width, int height) +{ + t_img *a; + + a = (t_img*)ft_memalloc(sizeof(t_img)); + init_img_zero(a); + if ((a->img = mlx_new_image(mlx, width, height)) == NULL) + ft_malloc_error(); + if ((a->data = mlx_get_data_addr(a->img, &(a->bpp), &(a->sl), + &(a->endian))) == NULL) + ft_malloc_error(); + a->x = width; + a->y = height; + return (a); +} diff --git a/src/init_light.c b/src/init_light.c new file mode 100644 index 0000000..3bb2b01 --- /dev/null +++ b/src/init_light.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* init_light.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 23:20:58 by ntrahy #+# #+# */ +/* Updated: 2017/01/05 14:04:45 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +t_light *init_light(void) +{ + t_light *light; + + light = (t_light *)ft_memalloc(sizeof(t_light)); + light->pos.x = 0; + light->pos.y = 0; + light->pos.z = 0; + light->color.r = 255; + light->color.g = 255; + light->color.b = 255; + light->next = NULL; + return (light); +} diff --git a/src/init_obj_cone.c b/src/init_obj_cone.c new file mode 100644 index 0000000..739d863 --- /dev/null +++ b/src/init_obj_cone.c @@ -0,0 +1,59 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* init_obj_cone.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 23:19:33 by ntrahy #+# #+# */ +/* Updated: 2017/01/09 19:23:48 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" +#include + +t_cone *free_cone(t_cone *cone) +{ + if (cone) + { + if (cone->tf_list) + free_tf_list(&(cone->tf_list)); + free_cut(&cone->cut); + free(cone); + cone = NULL; + } + return (NULL); +} + +t_cone *init_cone(double alpha) +{ + t_cone *cone; + + cone = (t_cone *)ft_memalloc(sizeof(t_cone)); + cone->tf_list = NULL; + cone->off_x = 0; + cone->off_y = 0; + cone->scale_x = 1; + cone->scale_y = 1; + cone->tan_alpha = pow(tan(alpha * M_PI / 180), 2); + cone->color = set_color(0, 255, 0); + cone->texture = NULL; + cone->bumpmap = NULL; + cone->texmodifier = 0; + cone->reflection = 0.6; + cone->shine = 0.6; + cone->cut = NULL; + return (cone); +} + +t_solid *get_cone_solid(void *p) +{ + t_cone *cone; + t_solid *solid; + + cone = (t_cone *)p; + solid = (t_solid *)ft_memalloc(sizeof(t_solid)); + solid->cone = cone; + return (solid); +} diff --git a/src/init_obj_csg.c b/src/init_obj_csg.c new file mode 100644 index 0000000..954a0c3 --- /dev/null +++ b/src/init_obj_csg.c @@ -0,0 +1,46 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* init_obj_csg.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 23:21:14 by ntrahy #+# #+# */ +/* Updated: 2017/01/09 20:45:32 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +t_csg *free_csg(t_csg *csg) +{ + if (csg) + { + free_obj(&(csg->first)); + free_obj(&(csg->second)); + csg = NULL; + } + return (NULL); +} + +t_csg *init_csg(void) +{ + t_csg *csg; + + csg = (t_csg *)ft_memalloc(sizeof(t_csg)); + csg->operation = -1; + csg->first = NULL; + csg->second = NULL; + return (csg); +} + +t_solid *get_csg_solid(void *p) +{ + t_csg *csg; + t_solid *solid; + + csg = (t_csg *)p; + solid = (t_solid *)ft_memalloc(sizeof(t_solid)); + solid->csg = csg; + return (solid); +} diff --git a/src/init_obj_cube.c b/src/init_obj_cube.c new file mode 100644 index 0000000..7f12bd7 --- /dev/null +++ b/src/init_obj_cube.c @@ -0,0 +1,94 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* init_obj_cube.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 23:21:24 by ntrahy #+# #+# */ +/* Updated: 2017/01/11 14:04:30 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void init_cube_triangles(t_cube *cube, t_vect p[6]) +{ + t_vect corner1; + t_vect corner2; + + corner1 = cube->corner1; + corner2 = cube->corner2; + cube->triangle[0] = add_triangle(init_tri_w_p(p[3], p[0], corner1)); + cube->triangle[1] = add_triangle(init_tri_w_p(corner1, p[4], p[3])); + cube->triangle[2] = add_triangle(init_tri_w_p(corner2, p[1], p[0])); + cube->triangle[3] = add_triangle(init_tri_w_p(p[0], p[3], corner2)); + cube->triangle[4] = add_triangle(init_tri_w_p(p[5], p[2], p[1])); + cube->triangle[5] = add_triangle(init_tri_w_p(p[1], corner2, p[5])); + cube->triangle[6] = add_triangle(init_tri_w_p(p[4], corner1, p[2])); + cube->triangle[7] = add_triangle(init_tri_w_p(p[2], p[5], p[4])); + cube->triangle[8] = add_triangle(init_tri_w_p(p[3], p[4], p[5])); + cube->triangle[9] = add_triangle(init_tri_w_p(p[5], corner2, p[3])); + cube->triangle[10] = add_triangle(init_tri_w_p(corner1, p[0], p[1])); + cube->triangle[11] = add_triangle(init_tri_w_p(p[1], p[2], corner1)); +} + +t_cube *compute_cube(t_cube *cube) +{ + t_vect corner1; + t_vect corner2; + t_vect p[6]; + + corner1 = cube->corner1; + corner2 = cube->corner2; + p[0] = init_vector(corner2.x, corner1.y, corner1.z, 1); + p[1] = init_vector(corner2.x, corner1.y, corner2.z, 1); + p[2] = init_vector(corner1.x, corner1.y, corner2.z, 1); + p[3] = init_vector(corner2.x, corner2.y, corner1.z, 1); + p[4] = init_vector(corner1.x, corner2.y, corner1.z, 1); + p[5] = init_vector(corner1.x, corner2.y, corner2.z, 1); + init_cube_triangles(cube, p); + return (cube); +} + +void cube_bzero(t_cube *cube) +{ + cube->corner1 = init_vector(-1, -1, 1, 1); + cube->corner2 = init_vector(1, 1, -1, 1); + cube->color = set_color(0, 255, 255); + cube->tf_list = NULL; + cube->reflection = 0.7; + cube->shine = 0.7; + cube->texture = NULL; + cube->bumpmap = NULL; + cube->cut = NULL; +} + +t_cube *init_cube(void) +{ + t_cube *cube; + int i; + + i = -1; + cube = (t_cube *)ft_memalloc(sizeof(t_cube)); + cube->closest_triangle = (int *)ft_memalloc(sizeof(int) * THREADS); + while (++i < THREADS) + cube->closest_triangle[i] = -1; + i = -1; + cube->triangle = (t_obj **)ft_memalloc(sizeof(t_obj *) * 12); + while (++i < 12) + cube->triangle[i] = NULL; + cube_bzero(cube); + return (cube); +} + +t_solid *get_cube_solid(void *p) +{ + t_cube *cube; + t_solid *solid; + + cube = (t_cube *)p; + solid = (t_solid *)ft_memalloc(sizeof(t_solid)); + solid->cube = cube; + return (solid); +} diff --git a/src/init_obj_cylinder.c b/src/init_obj_cylinder.c new file mode 100644 index 0000000..ec2e28f --- /dev/null +++ b/src/init_obj_cylinder.c @@ -0,0 +1,57 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* init_obj_cylinder.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 23:21:34 by ntrahy #+# #+# */ +/* Updated: 2017/01/09 19:18:32 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" +#include + +t_cylinder *free_cylinder(t_cylinder *cylinder) +{ + if (cylinder) + { + free_tf_list(&(cylinder->tf_list)); + free_cut(&cylinder->cut); + free(cylinder); + cylinder = NULL; + } + return (NULL); +} + +t_cylinder *init_cylinder(void) +{ + t_cylinder *cylinder; + + cylinder = (t_cylinder *)ft_memalloc(sizeof(t_cylinder)); + cylinder->tf_list = NULL; + cylinder->off_x = 0; + cylinder->off_y = 0; + cylinder->scale_x = 1; + cylinder->scale_y = 1; + cylinder->color = set_color(255, 255, 0); + cylinder->texture = NULL; + cylinder->bumpmap = NULL; + cylinder->texmodifier = 0; + cylinder->reflection = 0.6; + cylinder->shine = 0.6; + cylinder->cut = NULL; + return (cylinder); +} + +t_solid *get_cylinder_solid(void *p) +{ + t_cylinder *cylinder; + t_solid *solid; + + cylinder = (t_cylinder *)p; + solid = (t_solid *)ft_memalloc(sizeof(t_solid)); + solid->cylinder = cylinder; + return (solid); +} diff --git a/src/init_obj_hyperboloid.c b/src/init_obj_hyperboloid.c new file mode 100644 index 0000000..8ebd8ad --- /dev/null +++ b/src/init_obj_hyperboloid.c @@ -0,0 +1,57 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* init_obj_hyperboloid.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: gbrochar +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/12/14 18:40:52 by gbrochar #+# #+# */ +/* Updated: 2017/01/09 20:45:56 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +t_hyperboloid *free_hyperboloid(t_hyperboloid *hyperboloid) +{ + if (hyperboloid) + { + free_tf_list(&(hyperboloid->tf_list)); + free_cut(&hyperboloid->cut); + free(hyperboloid); + hyperboloid = NULL; + } + return (NULL); +} + +t_hyperboloid *init_hyperboloid(int sheets) +{ + t_hyperboloid *hyperboloid; + + hyperboloid = (t_hyperboloid *)ft_memalloc(sizeof(t_hyperboloid)); + hyperboloid->tf_list = NULL; + hyperboloid->off_x = 0; + hyperboloid->off_y = 0; + hyperboloid->scale_x = 1; + hyperboloid->scale_y = 1; + hyperboloid->color = set_color(0, 0, 255); + hyperboloid->texture = NULL; + hyperboloid->bumpmap = NULL; + hyperboloid->texmodifier = 0; + hyperboloid->reflection = 0.6; + hyperboloid->shine = 0.6; + hyperboloid->sheets = sheets; + hyperboloid->cut = NULL; + return (hyperboloid); +} + +t_solid *get_hyperboloid_solid(void *p) +{ + t_hyperboloid *hyperboloid; + t_solid *solid; + + hyperboloid = (t_hyperboloid *)p; + solid = (t_solid *)ft_memalloc(sizeof(t_solid)); + solid->hyperboloid = hyperboloid; + return (solid); +} diff --git a/src/init_obj_paraboloid.c b/src/init_obj_paraboloid.c new file mode 100644 index 0000000..f357735 --- /dev/null +++ b/src/init_obj_paraboloid.c @@ -0,0 +1,56 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* init_obj_paraboloid.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 23:21:44 by ntrahy #+# #+# */ +/* Updated: 2017/01/09 20:46:10 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +t_paraboloid *free_paraboloid(t_paraboloid *paraboloid) +{ + if (paraboloid) + { + free_tf_list(&(paraboloid->tf_list)); + free_cut(¶boloid->cut); + free(paraboloid); + paraboloid = NULL; + } + return (NULL); +} + +t_paraboloid *init_paraboloid(void) +{ + t_paraboloid *paraboloid; + + paraboloid = (t_paraboloid *)ft_memalloc(sizeof(t_paraboloid)); + paraboloid->tf_list = NULL; + paraboloid->off_x = 0; + paraboloid->off_y = 0; + paraboloid->scale_x = 1; + paraboloid->scale_y = 1; + paraboloid->color = set_color(0, 0, 255); + paraboloid->texture = NULL; + paraboloid->bumpmap = NULL; + paraboloid->texmodifier = 0; + paraboloid->reflection = 0.6; + paraboloid->shine = 0.6; + paraboloid->cut = NULL; + return (paraboloid); +} + +t_solid *get_paraboloid_solid(void *p) +{ + t_paraboloid *paraboloid; + t_solid *solid; + + paraboloid = (t_paraboloid *)p; + solid = (t_solid *)ft_memalloc(sizeof(t_solid)); + solid->paraboloid = paraboloid; + return (solid); +} diff --git a/src/init_obj_plane.c b/src/init_obj_plane.c new file mode 100644 index 0000000..0e89aff --- /dev/null +++ b/src/init_obj_plane.c @@ -0,0 +1,70 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* init_obj_plane.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 23:21:52 by ntrahy #+# #+# */ +/* Updated: 2017/01/09 19:19:51 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" +#include + +t_plane *free_plane(t_plane *plane) +{ + if (plane) + { + free_tf_list(&(plane->tf_list)); + free_cut(&plane->cut); + free(plane); + plane = NULL; + } + return (NULL); +} + +static void plane_bzero(t_plane *plane) +{ + plane->tf_list = NULL; + plane->off_x = 0; + plane->off_y = 0; + plane->scale_x = 1; + plane->scale_y = 1; + plane->texmodifier = 0; + plane->normal = init_vector(0, 1, 0, 0); + plane->dist = 0; + plane->color = set_color(255, 255, 0); + plane->texture = NULL; + plane->bumpmap = NULL; + plane->reflection = 0.6; + plane->shine = 0.6; + plane->cut_type = 0; + plane->cut = NULL; +} + +t_plane *init_plane(void) +{ + t_plane *plane; + int i; + + i = -1; + plane = (t_plane *)ft_memalloc(sizeof(t_plane)); + plane->cutted_obj = (t_obj **)ft_memalloc(sizeof(t_obj *) * THREADS); + while (++i < THREADS) + plane->cutted_obj[i] = NULL; + plane_bzero(plane); + return (plane); +} + +t_solid *get_plane_solid(void *p) +{ + t_plane *plane; + t_solid *solid; + + plane = (t_plane *)p; + solid = (t_solid *)ft_memalloc(sizeof(t_solid)); + solid->plane = plane; + return (solid); +} diff --git a/src/init_obj_prism.c b/src/init_obj_prism.c new file mode 100644 index 0000000..ef1d9a5 --- /dev/null +++ b/src/init_obj_prism.c @@ -0,0 +1,96 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* init_obj_prism.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 23:22:00 by ntrahy #+# #+# */ +/* Updated: 2017/01/09 19:20:02 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +t_prism *free_prism(t_prism *prism) +{ + int i; + + i = 0; + if (prism) + { + free_tf_list(&(prism->tf_list)); + while (i < 4) + { + if (prism->triangle[i]) + free_obj(&prism->triangle[i]); + i++; + } + free_cut(&prism->cut); + free(prism); + prism = NULL; + } + return (NULL); +} + +t_prism *compute_prism(t_prism *prism) +{ + t_vect a; + t_vect b; + t_vect c; + t_vect d; + + a = prism->a; + b = prism->b; + c = prism->c; + d = prism->d; + prism->triangle[0] = add_triangle(init_tri_w_p(a, b, c)); + prism->triangle[1] = add_triangle(init_tri_w_p(b, d, c)); + prism->triangle[2] = add_triangle(init_tri_w_p(a, c, d)); + prism->triangle[3] = add_triangle(init_tri_w_p(a, b, d)); + return (prism); +} + +void prism_bzero(t_prism *prism) +{ + prism->a = init_vector(-1, -1, 0, 1); + prism->b = init_vector(1, -1, 0, 1); + prism->c = init_vector(0, 1, 0, 1); + prism->d = init_vector(0, 0, 1, 1); + prism->color = set_color(255, 0, 0); + prism->tf_list = NULL; + prism->texture = NULL; + prism->bumpmap = NULL; + prism->reflection = 0.6; + prism->shine = 0.6; + prism->cut = NULL; +} + +t_prism *init_prism(void) +{ + t_prism *prism; + int i; + + i = -1; + prism = (t_prism *)ft_memalloc(sizeof(t_prism)); + prism_bzero(prism); + prism->triangle = (t_obj **)ft_memalloc(sizeof(t_obj *) * 4); + while (++i < 4) + prism->triangle[i] = NULL; + prism->closest_triangle = (int *)ft_memalloc(sizeof(int) * THREADS); + i = -1; + while (++i < THREADS) + prism->closest_triangle[i] = -1; + return (prism); +} + +t_solid *get_prism_solid(void *p) +{ + t_prism *prism; + t_solid *solid; + + prism = (t_prism *)p; + solid = (t_solid *)ft_memalloc(sizeof(t_solid)); + solid->prism = prism; + return (solid); +} diff --git a/src/init_obj_sphere.c b/src/init_obj_sphere.c new file mode 100644 index 0000000..792f310 --- /dev/null +++ b/src/init_obj_sphere.c @@ -0,0 +1,58 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* init_obj_sphere.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 23:22:26 by ntrahy #+# #+# */ +/* Updated: 2017/01/09 19:20:13 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" +#include + +t_sphere *free_sphere(t_sphere *sphere) +{ + if (sphere) + { + free_tf_list(&(sphere->tf_list)); + free_cut(&sphere->cut); + free(sphere); + sphere = NULL; + } + return (NULL); +} + +t_sphere *init_sphere(double rad) +{ + t_sphere *sphere; + + sphere = (t_sphere *)ft_memalloc(sizeof(t_sphere)); + sphere->tf_list = NULL; + sphere->off_x = 0; + sphere->off_y = 0; + sphere->scale_x = 1; + sphere->scale_y = 1; + sphere->radius = rad; + sphere->color = set_color(255, 0, 0); + sphere->texmodifier = 0; + sphere->texture = NULL; + sphere->bumpmap = NULL; + sphere->reflection = 0.6; + sphere->shine = 0.6; + sphere->cut = NULL; + return (sphere); +} + +t_solid *get_sphere_solid(void *p) +{ + t_sphere *sphere; + t_solid *solid; + + sphere = (t_sphere *)p; + solid = (t_solid *)ft_memalloc(sizeof(t_solid)); + solid->sphere = sphere; + return (solid); +} diff --git a/src/init_obj_triangle.c b/src/init_obj_triangle.c new file mode 100644 index 0000000..a71e225 --- /dev/null +++ b/src/init_obj_triangle.c @@ -0,0 +1,89 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* init_obj_triangle.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 23:22:37 by ntrahy #+# #+# */ +/* Updated: 2017/01/09 19:20:26 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +t_triangle *free_triangle(t_triangle *triangle) +{ + if (triangle) + { + free_tf_list(&(triangle->tf_list)); + free_cut(&triangle->cut); + free_triangle(triangle); + triangle = NULL; + } + return (NULL); +} + +t_vect compute_triangle_normal(t_triangle *triangle) +{ + t_vect normal; + + normal = cross_product_vector(triangle->ab, triangle->cb); + normalize_vector(&normal); + return (normal); +} + +void calculate_sides(t_triangle *triangle) +{ + triangle->ab = init_vector(triangle->b.x - triangle->a.x, + triangle->b.y - triangle->a.y, + triangle->b.z - triangle->a.z, 0); + triangle->ac = init_vector(triangle->c.x - triangle->a.x, + triangle->c.y - triangle->a.y, + triangle->c.z - triangle->a.z, 0); + triangle->ba = init_vector(triangle->a.x - triangle->b.x, + triangle->a.y - triangle->b.y, + triangle->a.z - triangle->b.z, 0); + triangle->bc = init_vector(triangle->c.x - triangle->b.x, + triangle->c.y - triangle->b.y, + triangle->c.z - triangle->b.z, 0); + triangle->ca = init_vector(triangle->a.x - triangle->c.x, + triangle->a.y - triangle->c.y, + triangle->a.z - triangle->c.z, 0); + triangle->cb = init_vector(triangle->b.x - triangle->c.x, + triangle->b.y - triangle->c.y, + triangle->b.z - triangle->c.z, 0); +} + +t_triangle *compute_triangle(t_triangle *triangle) +{ + calculate_sides(triangle); + triangle->normal = compute_triangle_normal(triangle); + triangle->distance = dot_product_vector(triangle->normal, triangle->a); + return (triangle); +} + +t_triangle *init_triangle(void) +{ + t_triangle *triangle; + + triangle = (t_triangle *)ft_memalloc(sizeof(t_triangle)); + triangle->tf_list = NULL; + triangle->a = init_vector(0, 0, 0, 1); + triangle->b = init_vector(0, 0, 0, 1); + triangle->c = init_vector(0, 0, 0, 1); + triangle->ab = init_vector(0, 0, 0, 0); + triangle->ac = init_vector(0, 0, 0, 0); + triangle->ba = init_vector(0, 0, 0, 0); + triangle->bc = init_vector(0, 0, 0, 0); + triangle->ca = init_vector(0, 0, 0, 0); + triangle->cb = init_vector(0, 0, 0, 0); + triangle->normal = init_vector(0, 0, 0, 0); + triangle->distance = 0; + triangle->color = set_color(255, 0, 0); + triangle->reflection = 0.5; + triangle->shine = 0.5; + triangle->texture = NULL; + triangle->bumpmap = NULL; + return (triangle); +} diff --git a/src/init_obj_triangle_bis.c b/src/init_obj_triangle_bis.c new file mode 100644 index 0000000..d97034d --- /dev/null +++ b/src/init_obj_triangle_bis.c @@ -0,0 +1,45 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* init_obj_triangle_bis.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/03 00:16:38 by ntrahy #+# #+# */ +/* Updated: 2017/01/07 14:30:16 by gbrochar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +t_triangle *init_tri_w_p(t_vect a, t_vect b, t_vect c) +{ + t_triangle *triangle; + + triangle = (t_triangle *)ft_memalloc(sizeof(t_triangle)); + triangle->tf_list = NULL; + triangle->a = a; + triangle->b = b; + triangle->c = c; + calculate_sides(triangle); + triangle->normal = compute_triangle_normal(triangle); + triangle->distance = dot_product_vector(triangle->normal, triangle->a); + triangle->color = set_color(255, 0, 0); + triangle->reflection = 0.5; + triangle->shine = 0.5; + triangle->texture = NULL; + triangle->bumpmap = NULL; + triangle->cut = NULL; + return (triangle); +} + +t_solid *get_triangle_solid(void *p) +{ + t_triangle *triangle; + t_solid *solid; + + triangle = (t_triangle *)p; + solid = (t_solid *)ft_memalloc(sizeof(t_solid)); + solid->triangle = triangle; + return (solid); +} diff --git a/src/init_ray.c b/src/init_ray.c new file mode 100644 index 0000000..22ccd4f --- /dev/null +++ b/src/init_ray.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ray_init.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/10/01 16:28:40 by scebula #+# #+# */ +/* Updated: 2016/10/01 16:34:36 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void copy_ray_value(t_ray *r1, t_ray r2) +{ + r1->ori = copy_vector(r2.ori); + r1->dir = copy_vector(r2.dir); +} + +t_ray init_ray(t_vect ori, t_vect dir) +{ + t_ray ray; + + ray.ori = ori; + ray.dir = dir; + return (ray); +} diff --git a/src/init_scenes.c b/src/init_scenes.c new file mode 100644 index 0000000..d774373 --- /dev/null +++ b/src/init_scenes.c @@ -0,0 +1,69 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* init_scenes.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 23:23:46 by ntrahy #+# #+# */ +/* Updated: 2017/01/05 14:52:18 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" +#include + +void g_scene(t_data *d, char *name) +{ + int fd; + char *path; + + if (!(path = ft_strnew(ft_strlen(name) + ft_strlen("scenes/") + 1))) + ft_malloc_error(); + ft_strcat(path, "scenes/"); + ft_strcat(path, name); + if ((fd = open(path, O_RDONLY)) < 3) + ft_parsing_error(0, "file opening error", name); + lexer(fd, name); + close(fd); + if ((fd = open(path, O_RDONLY)) < 3) + ft_parsing_error(0, "file re-opening error", name); + parser(fd, d, name); + free(path); +} + +t_data *create_scene_d(t_env *e, char *name) +{ + t_data *d; + + d = (t_data *)ft_memalloc(sizeof(t_data)); + init_data_zero(d); + d->mlx = e->mlx; + d->win = e->win; + g_scene(d, name); + d->width = 250; + d->height = 175; + d->dpp = d->aa_lvl * d->aa_lvl; + d->tld = 0; + d->func = init_function(); + create_cam(&(d->cam), d); + d->img = init_img(d->mlx, d->width, d->height); + return (d); +} + +void load_scenes(t_env *e) +{ + t_scene *tmp; + + e->lst_scene = get_scene_list(); + tmp = e->lst_scene; + while (tmp) + { + tmp->d = create_scene_d(e, tmp->name); + tmp = tmp->next; + e->lst_size++; + } + e->page_m = e->lst_size / 6; + if (e->lst_size % 6) + e->page_m++; +} diff --git a/src/init_solid.c b/src/init_solid.c new file mode 100644 index 0000000..138d201 --- /dev/null +++ b/src/init_solid.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* init_solid.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 23:24:12 by ntrahy #+# #+# */ +/* Updated: 2017/01/03 12:27:14 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +t_solid *init_solid(void *obj, char type) +{ + t_solid *solid; + + solid = NULL; + if (type == SPHERE) + return (get_sphere_solid(obj)); + else if (type == PLANE) + return (get_plane_solid(obj)); + else if (type == CYLINDER) + return (get_cylinder_solid(obj)); + else if (type == CONE) + return (get_cone_solid(obj)); + else if (type == TRIANGLE) + return (get_triangle_solid(obj)); + else if (type == PRISM) + return (get_prism_solid(obj)); + else if (type == CUBE) + return (get_cube_solid(obj)); + else if (type == PARABOLOID) + return (get_paraboloid_solid(obj)); + else if (type == HYPERBOLOID) + return (get_hyperboloid_solid(obj)); + else if (type == CSG) + return (get_csg_solid(obj)); + return (solid); +} diff --git a/src/init_vector.c b/src/init_vector.c new file mode 100644 index 0000000..9f7dc78 --- /dev/null +++ b/src/init_vector.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* init_vector.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 23:24:21 by ntrahy #+# #+# */ +/* Updated: 2017/01/02 23:24:22 by ntrahy ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" +#include + +t_vect init_vector(double x, double y, double z, double w) +{ + t_vect v; + + v.x = x; + v.y = y; + v.z = z; + v.w = w; + return (v); +} diff --git a/src/light_cam_apply_parameters.c b/src/light_cam_apply_parameters.c new file mode 100644 index 0000000..040215d --- /dev/null +++ b/src/light_cam_apply_parameters.c @@ -0,0 +1,74 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* light_cam_apply_parameters.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/08 13:14:58 by scebula #+# #+# */ +/* Updated: 2017/01/08 13:16:04 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void manage_light_params(t_p_cache *cache, t_light *light) +{ + disect_param(cache->line, &PARAM_NAME, &PARAMS); + if (ft_strcmp(PARAM_NAME, "position") == 0 && chk(PARAMS, 3, + parsetest_vector, cache)) + light->pos = init_vector(TWO_ATOF, + ft_atof(PARAMS[2]), 1); + else if (ft_strcmp(PARAM_NAME, "color") == 0 && + chk(PARAMS, 3, tf, cache)) + light->color = set_color(ft_atoi(PARAMS[0]), ft_atoi(PARAMS[1]), + ft_atoi(PARAMS[2])); + else + ft_parsing_error(POS, + "unsupported parameter passed to light object", FN); +} + +void manage_camera_params(t_p_cache *cache, t_cam *cam) +{ + disect_param(cache->line, &PARAM_NAME, &PARAMS); + if (ft_strcmp(PARAM_NAME, "position") == 0 && chk(PARAMS, 3, + parsetest_vector, cache)) + cam->pos = init_vector(TWO_ATOF, + ft_atof(PARAMS[2]), 1); + else if (ft_strcmp(PARAM_NAME, "orientation") == 0 && chk(PARAMS, + 3, parsetest_vector, cache)) + cam->dir = init_vector(TWO_ATOF, + ft_atof(PARAMS[2]), 1); + else if (ft_strcmp(PARAM_NAME, "look_at") == 0 && chk(PARAMS, 3, + parsetest_vector, cache)) + cam->dir = init_vector(ft_atof(PARAMS[0]) - cam->pos.x, + ft_atof(PARAMS[1]) - cam->pos.y, + ft_atof(PARAMS[2]) - cam->pos.z, 0); + else + ft_parsing_error(POS, + "unsupported parameter passed to camera object", FN); + normalize_vector(&cam->dir); +} + +void manage_root_parameters(t_p_cache *cache, t_data *d) +{ + disect_param(cache->line, &PARAM_NAME, &PARAMS); + if (ft_strcmp(PARAM_NAME, "window_size") == 0 && + chk(PARAMS, 2, tf, cache)) + { + d->width = ft_atoi(PARAMS[0]); + d->height = ft_atoi(PARAMS[1]); + } + else if (ft_strcmp(PARAM_NAME, "AAlvl") == 0 && + chk(PARAMS, 1, tf, cache)) + d->aa_lvl = ft_atoi(PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "reflections") == 0 && + chk(PARAMS, 1, tf, cache)) + d->reflections = ft_atoi(PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "ambient") == 0 && + chk(PARAMS, 1, tf, cache)) + d->ambient = ft_atof(PARAMS[0]); + else + ft_parsing_error(POS, + "unsupported parameter passed to root object", FN); +} diff --git a/src/light_cam_populators.c b/src/light_cam_populators.c new file mode 100644 index 0000000..6c4cdef --- /dev/null +++ b/src/light_cam_populators.c @@ -0,0 +1,59 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* objects_populators.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/11/23 04:57:30 by ntrahy #+# #+# */ +/* Updated: 2017/01/08 17:18:58 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void populatelight(int fd, t_p_cache *cache, t_light **lst) +{ + t_light *light; + char lineid; + + if (cache->scope > 1) + ft_parsing_error(POS, "light should only be defined at root", FN); + light = init_light(); + while ((cache->linelen = get_next_line(fd, &cache->line)) > 0) + { + POS++; + lineid = line_identifier(cache); + if (lineid == CONTEXT_CLOSER) + break ; + else if (lineid == DECLARATOR) + ft_parsing_error(POS, "light cannot support items", FN); + else if (lineid == PARAMETER) + manage_light_params(cache, light); + free(cache->line); + } + push_light(lst, light); +} + +void populatecamera(int fd, t_p_cache *cache) +{ + char lineid; + + if (cache->scope > 1) + ft_parsing_error(POS, "camera should only be defined at root", FN); + while ((cache->linelen = get_next_line(fd, &cache->line)) > 0) + { + POS++; + lineid = line_identifier(cache); + if (lineid == CONTEXT_CLOSER) + break ; + else if (lineid == DECLARATOR) + ft_parsing_error(POS, "camera cannot support items", FN); + else if (lineid == PARAMETER) + manage_camera_params(cache, &cache->d->cam); + free(cache->line); + cache->d->cam.pos.x += ACC; + cache->d->cam.pos.y += ACC; + cache->d->cam.pos.z += ACC; + } +} diff --git a/src/list_light_manage.c b/src/list_light_manage.c new file mode 100644 index 0000000..8dde4d3 --- /dev/null +++ b/src/list_light_manage.c @@ -0,0 +1,44 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* list_light_manage.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 23:25:10 by ntrahy #+# #+# */ +/* Updated: 2017/01/02 23:25:11 by ntrahy ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void push_light(t_light **begin_light, t_light *light) +{ + t_light *tmp; + + tmp = *begin_light; + if (tmp) + { + while (tmp->next) + tmp = tmp->next; + tmp->next = light; + } + else + *begin_light = light; +} + +t_light *free_light_list(t_light **begin_light_list) +{ + t_light *tmp; + t_light *next_tmp; + + tmp = *begin_light_list; + while (tmp) + { + next_tmp = tmp->next; + free(tmp); + tmp = next_tmp; + } + *begin_light_list = NULL; + return (NULL); +} diff --git a/src/list_obj_cone.c b/src/list_obj_cone.c new file mode 100644 index 0000000..d9fbfd8 --- /dev/null +++ b/src/list_obj_cone.c @@ -0,0 +1,44 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* list_obj_cone.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 23:25:22 by ntrahy #+# #+# */ +/* Updated: 2017/01/07 14:31:10 by gbrochar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +static t_obj *add_cone(t_cone *cone) +{ + t_obj *obj; + + obj = (t_obj *)ft_memalloc(sizeof(t_obj)); + obj->type = CONE; + obj->next = NULL; + obj->solid = init_solid(cone, CONE); + obj->reflectionx = &cone->reflection; + obj->shinex = &cone->shine; + obj->cut = cone->cut; + return (obj); +} + +t_obj *push_cone(t_obj **begin_obj, t_cone *cone) +{ + t_obj *tmp; + + tmp = *begin_obj; + if (tmp) + { + while (tmp->next) + tmp = tmp->next; + tmp->next = add_cone(cone); + return (tmp->next); + } + else + *begin_obj = add_cone(cone); + return (*begin_obj); +} diff --git a/src/list_obj_csg.c b/src/list_obj_csg.c new file mode 100644 index 0000000..5a3cf94 --- /dev/null +++ b/src/list_obj_csg.c @@ -0,0 +1,44 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* list_obj_csg.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 23:23:04 by ntrahy #+# #+# */ +/* Updated: 2017/01/05 14:38:29 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +static t_obj *add_csg(t_csg *csg) +{ + t_obj *obj; + + obj = (t_obj *)ft_memalloc(sizeof(t_obj)); + obj->type = CSG; + obj->next = NULL; + obj->solid = init_solid(csg, CSG); + obj->reflectionx = NULL; + obj->shinex = NULL; + obj->cut = NULL; + return (obj); +} + +t_obj *push_csg(t_obj **begin_obj, t_csg *csg) +{ + t_obj *tmp; + + tmp = *begin_obj; + if (tmp) + { + while (tmp->next) + tmp = tmp->next; + tmp->next = add_csg(csg); + return (tmp->next); + } + else + *begin_obj = add_csg(csg); + return (*begin_obj); +} diff --git a/src/list_obj_cube.c b/src/list_obj_cube.c new file mode 100644 index 0000000..6c74845 --- /dev/null +++ b/src/list_obj_cube.c @@ -0,0 +1,44 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* list_obj_cube.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 23:23:00 by ntrahy #+# #+# */ +/* Updated: 2017/01/07 14:31:15 by gbrochar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +static t_obj *add_cube(t_cube *cube) +{ + t_obj *obj; + + obj = (t_obj *)ft_memalloc(sizeof(t_obj)); + obj->type = CUBE; + obj->next = NULL; + obj->reflectionx = &cube->reflection; + obj->shinex = &cube->shine; + obj->solid = init_solid(cube, CUBE); + obj->cut = cube->cut; + return (obj); +} + +t_obj *push_cube(t_obj **begin_obj, t_cube *cube) +{ + t_obj *tmp; + + tmp = *begin_obj; + if (tmp) + { + while (tmp->next) + tmp = tmp->next; + tmp->next = add_cube(cube); + return (tmp->next); + } + else + *begin_obj = add_cube(cube); + return (*begin_obj); +} diff --git a/src/list_obj_cylinder.c b/src/list_obj_cylinder.c new file mode 100644 index 0000000..16ffb69 --- /dev/null +++ b/src/list_obj_cylinder.c @@ -0,0 +1,44 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* list_obj_cylinder.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 23:23:17 by ntrahy #+# #+# */ +/* Updated: 2017/01/07 14:31:14 by gbrochar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +static t_obj *add_cylinder(t_cylinder *cylinder) +{ + t_obj *obj; + + obj = (t_obj *)ft_memalloc(sizeof(t_obj)); + obj->type = CYLINDER; + obj->next = NULL; + obj->solid = init_solid(cylinder, CYLINDER); + obj->reflectionx = &cylinder->reflection; + obj->shinex = &cylinder->shine; + obj->cut = cylinder->cut; + return (obj); +} + +t_obj *push_cylinder(t_obj **begin_obj, t_cylinder *cylinder) +{ + t_obj *tmp; + + tmp = *begin_obj; + if (tmp) + { + while (tmp->next) + tmp = tmp->next; + tmp->next = add_cylinder(cylinder); + return (tmp->next); + } + else + *begin_obj = add_cylinder(cylinder); + return (*begin_obj); +} diff --git a/src/list_obj_hyperboloid.c b/src/list_obj_hyperboloid.c new file mode 100644 index 0000000..219accf --- /dev/null +++ b/src/list_obj_hyperboloid.c @@ -0,0 +1,43 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* list_obj_hyperboloid.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 23:25:42 by ntrahy #+# #+# */ +/* Updated: 2017/01/07 14:31:16 by gbrochar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +static t_obj *add_hyperboloid(t_hyperboloid *hyperboloid) +{ + t_obj *obj; + + obj = (t_obj *)ft_memalloc(sizeof(t_obj)); + obj->type = HYPERBOLOID; + obj->next = NULL; + obj->solid = init_solid(hyperboloid, HYPERBOLOID); + obj->reflectionx = &hyperboloid->reflection; + obj->shinex = &hyperboloid->shine; + return (obj); +} + +t_obj *push_hyperboloid(t_obj **begin_obj, t_hyperboloid *hyperboloid) +{ + t_obj *tmp; + + tmp = *begin_obj; + if (tmp) + { + while (tmp->next) + tmp = tmp->next; + tmp->next = add_hyperboloid(hyperboloid); + return (tmp->next); + } + else + *begin_obj = add_hyperboloid(hyperboloid); + return (*begin_obj); +} diff --git a/src/list_obj_paraboloid.c b/src/list_obj_paraboloid.c new file mode 100644 index 0000000..75117d6 --- /dev/null +++ b/src/list_obj_paraboloid.c @@ -0,0 +1,44 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* list_obj_paraboloid.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 23:25:48 by ntrahy #+# #+# */ +/* Updated: 2017/01/07 14:31:16 by gbrochar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +static t_obj *add_paraboloid(t_paraboloid *paraboloid) +{ + t_obj *obj; + + obj = (t_obj *)ft_memalloc(sizeof(t_obj)); + obj->type = PARABOLOID; + obj->next = NULL; + obj->solid = init_solid(paraboloid, PARABOLOID); + obj->reflectionx = ¶boloid->reflection; + obj->shinex = ¶boloid->shine; + obj->cut = paraboloid->cut; + return (obj); +} + +t_obj *push_paraboloid(t_obj **begin_obj, t_paraboloid *paraboloid) +{ + t_obj *tmp; + + tmp = *begin_obj; + if (tmp) + { + while (tmp->next) + tmp = tmp->next; + tmp->next = add_paraboloid(paraboloid); + return (tmp->next); + } + else + *begin_obj = add_paraboloid(paraboloid); + return (*begin_obj); +} diff --git a/src/list_obj_plane.c b/src/list_obj_plane.c new file mode 100644 index 0000000..7fd5dee --- /dev/null +++ b/src/list_obj_plane.c @@ -0,0 +1,44 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* list_obj_plane.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 23:26:06 by ntrahy #+# #+# */ +/* Updated: 2017/01/07 14:31:23 by gbrochar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +t_obj *add_plane(t_plane *plane) +{ + t_obj *obj; + + obj = (t_obj *)ft_memalloc(sizeof(t_obj)); + obj->type = PLANE; + obj->next = NULL; + obj->solid = init_solid(plane, PLANE); + obj->reflectionx = &plane->reflection; + obj->shinex = &plane->shine; + obj->cut = plane->cut; + return (obj); +} + +t_obj *push_plane(t_obj **begin_obj, t_plane *plane) +{ + t_obj *tmp; + + tmp = *begin_obj; + if (tmp) + { + while (tmp->next) + tmp = tmp->next; + tmp->next = add_plane(plane); + return (tmp->next); + } + else + *begin_obj = add_plane(plane); + return (*begin_obj); +} diff --git a/src/list_obj_prism.c b/src/list_obj_prism.c new file mode 100644 index 0000000..b58caec --- /dev/null +++ b/src/list_obj_prism.c @@ -0,0 +1,44 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* list_obj_prism.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/03 00:28:22 by ntrahy #+# #+# */ +/* Updated: 2017/01/07 14:31:24 by gbrochar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +static t_obj *add_prism(t_prism *prism) +{ + t_obj *obj; + + obj = (t_obj *)ft_memalloc(sizeof(t_obj)); + obj->type = PRISM; + obj->next = NULL; + obj->reflectionx = &prism->reflection; + obj->shinex = &prism->shine; + obj->solid = init_solid(prism, TRIANGLE); + obj->cut = prism->cut; + return (obj); +} + +t_obj *push_prism(t_obj **begin_obj, t_prism *prism) +{ + t_obj *tmp; + + tmp = *begin_obj; + if (tmp) + { + while (tmp->next) + tmp = tmp->next; + tmp->next = add_prism(prism); + return (tmp->next); + } + else + *begin_obj = add_prism(prism); + return (*begin_obj); +} diff --git a/src/list_obj_sphere.c b/src/list_obj_sphere.c new file mode 100644 index 0000000..0af1c6b --- /dev/null +++ b/src/list_obj_sphere.c @@ -0,0 +1,43 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* object_sphere.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/10/01 16:24:17 by scebula #+# #+# */ +/* Updated: 2017/01/07 14:31:25 by gbrochar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +static t_obj *add_sphere(t_sphere *sphere) +{ + t_obj *obj; + + obj = (t_obj *)ft_memalloc(sizeof(t_obj)); + obj->type = SPHERE; + obj->next = NULL; + obj->solid = init_solid(sphere, SPHERE); + obj->reflectionx = &sphere->reflection; + obj->shinex = &sphere->shine; + obj->cut = sphere->cut; + return (obj); +} + +t_obj *push_sphere(t_obj **begin_obj, t_sphere *sphere) +{ + t_obj *tmp; + + tmp = *begin_obj; + if (tmp) + { + while (tmp->next) + tmp = tmp->next; + tmp->next = add_sphere(sphere); + return (tmp->next); + } + *begin_obj = add_sphere(sphere); + return (*begin_obj); +} diff --git a/src/list_obj_triangle.c b/src/list_obj_triangle.c new file mode 100644 index 0000000..0073249 --- /dev/null +++ b/src/list_obj_triangle.c @@ -0,0 +1,44 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* list_obj_triangle.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/03 00:29:28 by ntrahy #+# #+# */ +/* Updated: 2017/01/07 14:31:04 by gbrochar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +t_obj *add_triangle(t_triangle *triangle) +{ + t_obj *obj; + + obj = (t_obj *)ft_memalloc(sizeof(t_obj)); + obj->type = TRIANGLE; + obj->next = NULL; + obj->solid = init_solid(triangle, TRIANGLE); + obj->reflectionx = &triangle->reflection; + obj->shinex = &triangle->shine; + obj->cut = triangle->cut; + return (obj); +} + +t_obj *push_triangle(t_obj **begin_obj, t_triangle *triangle) +{ + t_obj *tmp; + + tmp = *begin_obj; + if (tmp) + { + while (tmp->next) + tmp = tmp->next; + tmp->next = add_triangle(triangle); + return (tmp->next); + } + else + *begin_obj = add_triangle(triangle); + return (*begin_obj); +} diff --git a/src/list_scene.c b/src/list_scene.c new file mode 100644 index 0000000..5b63aed --- /dev/null +++ b/src/list_scene.c @@ -0,0 +1,58 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* list_scene.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/03 00:31:23 by ntrahy #+# #+# */ +/* Updated: 2017/01/09 14:39:34 by ntrahy ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" +#include + +t_scene *new_scene(char *str) +{ + t_scene *new; + + new = (t_scene *)ft_memalloc(sizeof(t_scene)); + new->name = ft_strdup(str); + new->d = NULL; + new->next = NULL; + return (new); +} + +void pushback_scene(t_scene **a_lst, t_scene *new) +{ + t_scene *tmp; + + tmp = *a_lst; + if (tmp) + { + while (tmp->next) + tmp = tmp->next; + tmp->next = new; + } + else + *a_lst = new; +} + +t_scene *get_scene_list(void) +{ + DIR *dirp; + struct dirent *dp; + t_scene *lst_scenes; + int limit; + + limit = 0; + lst_scenes = NULL; + if (!(dirp = opendir("scenes/"))) + ft_error(); + while ((dp = readdir(dirp)) != NULL) + if (dp->d_name[0] != '.') + pushback_scene(&lst_scenes, new_scene(dp->d_name)); + closedir(dirp); + return (lst_scenes); +} diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..ac08da1 --- /dev/null +++ b/src/main.c @@ -0,0 +1,57 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* main.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/12/13 13:11:17 by scebula #+# #+# */ +/* Updated: 2017/01/11 13:08:07 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +static int main_loop(t_env *e) +{ + if (e->rendering == 1) + { + remake(e->current_scene); + e->rendering = 0; + } + if (e->loading == 1) + { + load_scenes(e); + display_scenes(e); + e->loading = 0; + } + return (1); +} + +int mlx_hub(t_env *e) +{ + mlx_loop_hook(e->mlx, &main_loop, e); + mlx_hook(e->win, 2, 1, events_key, e); + mlx_hook(e->win, 4, 1, events_mouse, e); + mlx_hook(e->win, 17, (1L << 17), ft_close_cross, e); + mlx_loop(e->mlx); + return (0); +} + +int welcome_to_rt(t_env *e) +{ + mlx_clear_window(e->mlx, e->win); + mlx_put_image_to_window(e->mlx, e->win, e->img_wel, 0, 0); + return (1); +} + +int main(void) +{ + t_env *e; + + e = init_env(); + if (!welcome_to_rt(e)) + ft_error(); + mlx_hub(e); + return (0); +} diff --git a/src/maths_matrix.c b/src/maths_matrix.c new file mode 100644 index 0000000..0a9c5dc --- /dev/null +++ b/src/maths_matrix.c @@ -0,0 +1,69 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* maths_matrix.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/03 00:43:22 by ntrahy #+# #+# */ +/* Updated: 2017/01/03 00:43:24 by ntrahy ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" +#include + +static t_matrix transposed_matrix(t_matrix m) +{ + t_matrix matrix; + + matrix.type = m.type; + matrix.m11 = m.m11; + matrix.m12 = m.m21; + matrix.m13 = m.m31; + matrix.m14 = m.m41; + matrix.m21 = m.m12; + matrix.m22 = m.m22; + matrix.m23 = m.m32; + matrix.m24 = m.m42; + matrix.m31 = m.m13; + matrix.m32 = m.m23; + matrix.m33 = m.m33; + matrix.m34 = m.m43; + matrix.m41 = m.m14; + matrix.m42 = m.m24; + matrix.m43 = m.m34; + matrix.m44 = m.m44; + return (matrix); +} + +void apply_matrix(t_matrix matrix, t_vect *v) +{ + double x; + double y; + double z; + double w; + + x = v->x; + y = v->y; + z = v->z; + w = v->w; + v->x = matrix.m11 * x + matrix.m12 * y + matrix.m13 * z + matrix.m14 * w; + v->y = matrix.m21 * x + matrix.m22 * y + matrix.m23 * z + matrix.m24 * w; + v->z = matrix.m31 * x + matrix.m32 * y + matrix.m33 * z + matrix.m34 * w; + v->w = matrix.m41 * x + matrix.m42 * y + matrix.m43 * z + matrix.m44 * w; +} + +t_matrix get_inverse_matrix(t_matrix m) +{ + t_matrix inverse; + + if (m.type == ROTATION_Y || m.type == ROTATION_X + || m.type == ROTATION_Z || m.type == ROTATION_XYZ) + inverse = transposed_matrix(m); + else if (m.type == SCALE) + inverse = init_scale_matrix(1 / m.m11, 1 / m.m22, 1 / m.m33); + else + inverse = init_translation_matrix(-m.m14, -m.m24, -m.m34); + return (inverse); +} diff --git a/src/maths_matrix_rotation.c b/src/maths_matrix_rotation.c new file mode 100644 index 0000000..87fd127 --- /dev/null +++ b/src/maths_matrix_rotation.c @@ -0,0 +1,143 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* maths_matrix_rotation.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/03 00:43:14 by ntrahy #+# #+# */ +/* Updated: 2017/01/03 12:41:52 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" +#include + +t_matrix init_yrotation_matrix(double theta) +{ + t_matrix matrix; + double rad; + + rad = theta * M_PI / 180; + matrix.type = ROTATION_Y; + matrix.m11 = cos(rad); + matrix.m12 = 0; + matrix.m13 = sin(rad); + matrix.m14 = 0; + matrix.m21 = 0; + matrix.m22 = 1; + matrix.m23 = 0; + matrix.m24 = 0; + matrix.m31 = -1 * sin(rad); + matrix.m32 = 0; + matrix.m33 = cos(rad); + matrix.m34 = 0; + matrix.m41 = 0; + matrix.m42 = 0; + matrix.m43 = 0; + matrix.m44 = 1; + return (matrix); +} + +t_matrix init_xrotation_matrix(double theta) +{ + t_matrix matrix; + double rad; + + rad = theta * M_PI / 180; + matrix.type = ROTATION_X; + matrix.m11 = 1; + matrix.m12 = 0; + matrix.m13 = 0; + matrix.m14 = 0; + matrix.m21 = 0; + matrix.m22 = cos(rad); + matrix.m23 = -1 * sin(rad); + matrix.m24 = 0; + matrix.m31 = 0; + matrix.m32 = sin(rad); + matrix.m33 = cos(rad); + matrix.m34 = 0; + matrix.m41 = 0; + matrix.m42 = 0; + matrix.m43 = 0; + matrix.m44 = 1; + return (matrix); +} + +t_matrix init_zrotation_matrix(double theta) +{ + t_matrix matrix; + double rad; + + matrix.type = ROTATION_Z; + rad = theta * M_PI / 180; + matrix.m11 = cos(rad); + matrix.m12 = -1 * sin(rad); + matrix.m13 = 0; + matrix.m14 = 0; + matrix.m21 = sin(rad); + matrix.m22 = cos(rad); + matrix.m23 = 0; + matrix.m24 = 0; + matrix.m31 = 0; + matrix.m32 = 0; + matrix.m33 = 1; + matrix.m34 = 0; + matrix.m41 = 0; + matrix.m42 = 0; + matrix.m43 = 0; + matrix.m44 = 1; + return (matrix); +} + +t_matrix init_xyzrotation_matrix(double theta, double x, double y, double z) +{ + t_matrix matrix; + double rad; + + matrix.type = ROTATION_XYZ; + rad = theta * M_PI / 180; + matrix.m11 = x * x * (1 - cos(rad)) + cos(rad); + matrix.m12 = x * y * (1 - cos(rad)) - z * sin(rad); + matrix.m13 = x * z * (1 - cos(rad)) + y * sin(rad); + matrix.m14 = 0; + matrix.m21 = y * x * (1 - cos(rad)) + z * sin(rad); + matrix.m22 = y * y * (1 - cos(rad)) + cos(rad); + matrix.m23 = y * z * (1 - cos(rad)) - x * sin(rad); + matrix.m24 = 0; + matrix.m31 = x * z * (1 - cos(rad)) - y * sin(rad); + matrix.m32 = y * z * (1 - cos(rad)) + x * sin(rad); + matrix.m33 = z * z * (1 - cos(rad)) + cos(rad); + matrix.m34 = 0; + matrix.m41 = 0; + matrix.m42 = 0; + matrix.m43 = 0; + matrix.m44 = 1; + return (matrix); +} + +t_vect get_bumped_vect(t_vect normal, t_vect transformed) +{ + t_vect base; + t_vect axe; + t_vect new_normal; + t_matrix xyz; + double angle; + + base = init_vector(0, 1, 0, 0); + apply_matrix(init_yrotation_matrix((atan2(normal.x, normal.z) + / (2 * M_PI) * 360)), &transformed); + if (dot_product_vector(base, transformed) == 1) + return (transformed); + normalize_vector(&transformed); + new_normal = transformed; + axe = cross_product_vector(base, normal); + normalize_vector(&axe); + angle = dot_product_vector(base, normal); + angle = acos(angle); + angle = 180 * angle / M_PI; + xyz = init_xyzrotation_matrix(angle, axe.x, axe.y, axe.z); + apply_matrix(xyz, &new_normal); + return (new_normal); +} diff --git a/src/maths_matrix_scale.c b/src/maths_matrix_scale.c new file mode 100644 index 0000000..02f695e --- /dev/null +++ b/src/maths_matrix_scale.c @@ -0,0 +1,38 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* maths_matrix_scale.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/03 00:34:45 by ntrahy #+# #+# */ +/* Updated: 2017/01/03 00:34:47 by ntrahy ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" +#include + +t_matrix init_scale_matrix(double x, double y, double z) +{ + t_matrix matrix; + + matrix.type = SCALE; + matrix.m11 = x; + matrix.m12 = 0; + matrix.m13 = 0; + matrix.m14 = 0; + matrix.m21 = 0; + matrix.m22 = y; + matrix.m23 = 0; + matrix.m24 = 0; + matrix.m31 = 0; + matrix.m32 = 0; + matrix.m33 = z; + matrix.m34 = 0; + matrix.m41 = 0; + matrix.m42 = 0; + matrix.m43 = 0; + matrix.m44 = 1; + return (matrix); +} diff --git a/src/maths_matrix_translation.c b/src/maths_matrix_translation.c new file mode 100644 index 0000000..5968a43 --- /dev/null +++ b/src/maths_matrix_translation.c @@ -0,0 +1,38 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* maths_matrix_translation.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/03 00:43:35 by ntrahy #+# #+# */ +/* Updated: 2017/01/03 00:43:36 by ntrahy ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" +#include + +t_matrix init_translation_matrix(double x, double y, double z) +{ + t_matrix matrix; + + matrix.type = TRANSLATION; + matrix.m11 = 1; + matrix.m12 = 0; + matrix.m13 = 0; + matrix.m14 = x; + matrix.m21 = 0; + matrix.m22 = 1; + matrix.m23 = 0; + matrix.m24 = y; + matrix.m31 = 0; + matrix.m32 = 0; + matrix.m33 = 1; + matrix.m34 = z; + matrix.m41 = 0; + matrix.m42 = 0; + matrix.m43 = 0; + matrix.m44 = 1; + return (matrix); +} diff --git a/src/maths_obj_cone.c b/src/maths_obj_cone.c new file mode 100644 index 0000000..1a10e04 --- /dev/null +++ b/src/maths_obj_cone.c @@ -0,0 +1,83 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* maths_obj_cone.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/03 00:43:45 by ntrahy #+# #+# */ +/* Updated: 2017/01/03 12:39:02 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" +#include + +int inside(t_obj *obj, t_ray ray, double *dist) +{ + t_vect raydir; + t_vect rayori; + t_vect normal; + int inside; + + inside = 0; + if (dist[0] < dist[1]) + dist[2] = dist[1]; + else + dist[2] = dist[0]; + raydir = ray.dir; + rayori = ray.ori; + mult_vector(&(raydir), dist[2]); + add_to_vector(&(rayori), raydir); + normal = init_vector(2 * rayori.x, -2 * TO_CONE->tan_alpha * + rayori.y, 2 * rayori.z, 0); + normalize_vector(&normal); + raydir = ray.dir; + negative_vector(&raydir); + if (dot_product_vector(normal, raydir) > 0) + inside = 1; + return (inside); +} + +static void check_for_solutions_cone(double *dist, t_ray ray, + t_obj *obj) +{ + if (dist[0] > dist[1]) + swap_double(&dist[0], &dist[1]); + if (dist[0] < 0 && dist[1] > 0) + dist[2] = dist[1]; + else if (dist[0] > 0 && dist[1] > 0) + dist[2] = dist[0]; + else + { + if (!inside(obj, ray, dist)) + { + dist[0] = 0; + dist[1] = 0; + } + } +} + +void get_cone_n(t_ray ray, t_obj *obj, t_thread *thread, + double *dist) +{ + double a; + double b; + double c; + double delta; + + (void)thread; + a = (ray.dir.x * ray.dir.x) + (ray.dir.z * ray.dir.z) - + obj->solid->cone->tan_alpha * (ray.dir.y * ray.dir.y); + b = (2 * ray.ori.x * ray.dir.x) + (2 * ray.ori.z * ray.dir.z) - + (2 * obj->solid->cone->tan_alpha * ray.ori.y * ray.dir.y); + c = pow(ray.ori.x, 2) + pow(ray.ori.z, 2) - + obj->solid->cone->tan_alpha * pow(ray.ori.y, 2); + delta = b * b - 4 * a * c; + if (delta > 0) + { + dist[0] = (((-1 * b - sqrt(delta))) / (2 * a)) - ACC; + dist[1] = (((-1 * b + sqrt(delta))) / (2 * a)) - ACC; + check_for_solutions_cone(dist, ray, obj); + } +} diff --git a/src/maths_obj_csg.c b/src/maths_obj_csg.c new file mode 100644 index 0000000..218c366 --- /dev/null +++ b/src/maths_obj_csg.c @@ -0,0 +1,95 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* maths_obj_csg.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/03 00:39:49 by ntrahy #+# #+# */ +/* Updated: 2017/01/10 18:32:35 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +static void transform_double(double *p, double *n) +{ + if (p[0] == 0 && p[1] == 0 && p[2] == 0) + { + p[0] = -1; + p[1] = -1; + p[2] = -1; + } + if (n[0] == 0 && n[1] == 0 && n[2] == 0) + { + n[0] = -1; + n[1] = -1; + n[2] = -1; + } +} + +void init_conditions_diff(t_research *r, double *p, double *n, + int type) +{ + if (type != UNION) + transform_double(p, n); + r->c.c1 = ((n[0] <= n[1] && p[0] < p[1] + && n[1] < p[0]) || (n[0] <= n[1] + && n[1] <= p[0] && p[0] == p[1])); + r->c.c2 = (n[0] <= p[0] && p[0] <= n[1] + && n[1] <= p[1]); + r->c.c3 = (n[0] <= p[0] && p[0] <= p[1] + && p[1] <= n[1]); + r->c.c4 = (p[0] <= n[0] && n[0] <= p[1] + && n[1] <= p[1]); + r->c.c5 = (p[0] <= n[0] && n[0] <= p[1] + && p[1] <= n[1]); + r->c.c6 = (p[0] <= p[1] && p[1] <= n[0] + && n[0] <= n[1]); + r->c.in_neg = (n[0] < 0 && n[1] > ACC); + r->c.neg_behind = n[0] < 0 && n[1] < 0; + r->c.neg_front = n[0] > ACC && n[1] > ACC; + r->c.p1 = p[0] > ACC && p[1] > p[0]; + r->c.p2 = p[0] < 0 && p[1] > ACC; + r->c.p3 = p[0] < p[1] && p[1] < 0; +} + +void calculate_first_and_second(t_research *rp, + t_research *rn, t_data *d, t_thread *thread) +{ + apply_inverse_tf(rp->current_obj, &(rp->modified_ray.ori), d); + apply_inverse_tf(rp->current_obj, &(rp->modified_ray.dir), d); + ((void (*)(t_ray ray, t_obj *, t_thread *, double *)) + d->func->get_obj_n[rp->current_obj->type]) + (rp->modified_ray, rp->current_obj, thread, rp->dist); + apply_inverse_tf(rn->current_obj, &(rn->modified_ray.ori), d); + apply_inverse_tf(rn->current_obj, &(rn->modified_ray.dir), d); + ((void (*)(t_ray ray, t_obj *, t_thread *, double *)) + d->func->get_obj_n[rn->current_obj->type]) + (rn->modified_ray, rn->current_obj, thread, rn->dist); +} + +void get_csg_n(t_research *r, t_thread *thread, t_data *d) +{ + t_obj *obj; + t_research rn; + t_research rp; + + obj = r->current_obj; + rp = *r; + rp.current_obj = TO_CSG->first; + rn = *r; + rn.current_obj = TO_CSG->second; + if (TO_CSG->operation == DIFF) + *(rn.current_obj->reflectionx) = 0; + calculate_first_and_second(&rp, &rn, d, thread); + if (rp.current_obj->type == PLANE) + rp.dist[1] += ACC; + init_conditions_diff(r, rp.dist, rn.dist, TO_CSG->operation); + if (TO_CSG->operation == DIFF) + check_diff(r, &rp, &rn); + else if (TO_CSG->operation == INTER) + check_inter(r, &rp, &rn); + else if (TO_CSG->operation == UNION) + check_add(r, &rp, &rn); +} diff --git a/src/maths_obj_cube.c b/src/maths_obj_cube.c new file mode 100644 index 0000000..7d93b95 --- /dev/null +++ b/src/maths_obj_cube.c @@ -0,0 +1,123 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* maths_obj_cube.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/03 00:42:30 by ntrahy #+# #+# */ +/* Updated: 2017/01/03 13:04:42 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +static void init_cube_distance2(double distance[12][3]) +{ + distance[6][0] = 0; + distance[6][1] = 0; + distance[6][2] = 0; + distance[7][0] = 0; + distance[7][1] = 0; + distance[7][2] = 0; + distance[8][0] = 0; + distance[8][1] = 0; + distance[8][2] = 0; + distance[9][0] = 0; + distance[9][1] = 0; + distance[9][2] = 0; + distance[10][0] = 0; + distance[10][1] = 0; + distance[10][2] = 0; + distance[11][0] = 0; + distance[11][1] = 0; + distance[11][2] = 0; +} + +static void init_cube_distance(double distance[12][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; + distance[4][0] = 0; + distance[4][1] = 0; + distance[4][2] = 0; + distance[5][0] = 0; + distance[5][1] = 0; + distance[5][2] = 0; + init_cube_distance2(distance); +} + +static void find_second_cube_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 < 12) + { + if (i != winning_i) + { + if (distance[i][2] != 0) + tmp = distance[i][2]; + } + } + if (tmp < dist[2]) + dist[0] = tmp; + else + dist[1] = tmp; +} + +void save_closest_triangle(t_obj *obj, t_thread *thread, int *i, + int *winning_i) +{ + if (thread == NULL) + TO_CUBE->closest_triangle[0] = *i; + else + TO_CUBE->closest_triangle[thread->num] = *i; + *winning_i = *i; +} + +void get_cube_n(t_ray ray, t_obj *obj, t_thread *thread, + double *dist) +{ + double distance[12][3]; + double tmp; + int i; + int winning_i; + + i = -1; + init_cube_distance(distance); + while (++i < 12) + get_triangle_n(ray, TO_CUBE->triangle[i], thread, distance[i]); + if (thread == NULL) + TO_CUBE->closest_triangle[0] = -1; + else + TO_CUBE->closest_triangle[thread->num] = -1; + tmp = 0; + i = -1; + while (++i < 12) + { + 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(obj, thread, &i, &winning_i); + } + } + find_second_cube_n(distance, dist, winning_i, tmp); +} diff --git a/src/maths_obj_cylinder.c b/src/maths_obj_cylinder.c new file mode 100644 index 0000000..e867203 --- /dev/null +++ b/src/maths_obj_cylinder.c @@ -0,0 +1,51 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* maths_obj_cylinder.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/03 00:44:39 by ntrahy #+# #+# */ +/* Updated: 2017/01/03 12:41:12 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" +#include + +static void check_for_solutions_cylinder(double *dist) +{ + if (dist[0] > dist[1]) + swap_double(&dist[0], &dist[1]); + if (dist[0] < 0 && dist[1] > 0) + dist[2] = dist[1]; + else if (dist[0] > 0 && dist[1] > 0) + dist[2] = dist[0]; + else + { + dist[0] = 0; + dist[1] = 0; + } +} + +void get_cylinder_n(t_ray ray, t_obj *obj, + t_thread *thread, double *dist) +{ + double a; + double b; + double c; + double delta; + + (void)thread; + (void)obj; + a = ray.dir.x * ray.dir.x + ray.dir.z * ray.dir.z; + b = 2 * ray.dir.x * ray.ori.x + 2 * ray.dir.z * ray.ori.z; + c = ray.ori.x * ray.ori.x + ray.ori.z * ray.ori.z - 1; + delta = (b * b) - (4 * a * c); + if (delta > 0) + { + dist[0] = (((-1 * b - sqrt(delta))) / (2 * a)) - ACC; + dist[1] = (((-1 * b + sqrt(delta))) / (2 * a)) - ACC; + check_for_solutions_cylinder(dist); + } +} diff --git a/src/maths_obj_hyperboloid.c b/src/maths_obj_hyperboloid.c new file mode 100644 index 0000000..e8626fd --- /dev/null +++ b/src/maths_obj_hyperboloid.c @@ -0,0 +1,55 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* maths_obj_hyperboloid.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/03 00:44:55 by ntrahy #+# #+# */ +/* Updated: 2017/01/10 18:01:20 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" +#include + +static void check_for_solutions_hyper(double *dist) +{ + if (dist[0] > dist[1]) + swap_double(&dist[0], &dist[1]); + if (dist[0] < 0 && dist[1] > 0) + dist[2] = dist[1]; + else if (dist[0] > 0 && dist[1] > 0) + dist[2] = dist[0]; + else + { + dist[0] = 0; + dist[1] = 0; + } +} + +void get_hyperboloid_n(t_ray ray, t_obj *obj, + t_thread *thread, double *dist) +{ + double a; + double b; + double c; + double delta; + + (void)thread; + (void)obj; + a = pow(ray.dir.x, 2) - pow(ray.dir.y, 2) + pow(ray.dir.z, 2); + b = (2 * ray.ori.x * ray.dir.x) - (2 * ray.ori.y * ray.dir.y) + + (2 * ray.ori.z * ray.dir.z); + if (TO_HYPERBOLOID->sheets == 1) + c = pow(ray.ori.x, 2) - pow(ray.ori.y, 2) + pow(ray.ori.z, 2) - 1; + else + c = pow(ray.ori.x, 2) - pow(ray.ori.y, 2) + pow(ray.ori.z, 2) + 1; + delta = (b * b) - (4 * a * c); + if (delta > 0) + { + dist[0] = (((-1 * b - sqrt(delta))) / (2 * a)) - ACC; + dist[1] = (((-1 * b + sqrt(delta))) / (2 * a)) - ACC; + check_for_solutions_hyper(dist); + } +} diff --git a/src/maths_obj_paraboloid.c b/src/maths_obj_paraboloid.c new file mode 100644 index 0000000..489a7e8 --- /dev/null +++ b/src/maths_obj_paraboloid.c @@ -0,0 +1,51 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* maths_obj_paraboloid.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/03 00:45:00 by ntrahy #+# #+# */ +/* Updated: 2017/01/03 13:52:00 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" +#include + +static void check_for_solutions_para(double *dist) +{ + if (dist[0] > dist[1]) + swap_double(&dist[0], &dist[1]); + if (dist[0] < 0 && dist[1] > 0) + dist[2] = dist[1]; + else if (dist[0] > 0 && dist[1] > 0) + dist[2] = dist[0]; + else + { + dist[0] = 0; + dist[1] = 0; + } +} + +void get_paraboloid_n(t_ray ray, t_obj *obj, + t_thread *thread, double *dist) +{ + double a; + double b; + double c; + double delta; + + (void)thread; + (void)obj; + a = ray.dir.x * ray.dir.x + ray.dir.z * ray.dir.z; + b = 2 * ray.dir.x * ray.ori.x + 2 * ray.dir.z * ray.ori.z - ray.dir.y; + c = ray.ori.x * ray.ori.x + ray.ori.z * ray.ori.z - ray.ori.y; + delta = (b * b) - (4 * a * c); + if (delta > 0) + { + dist[0] = (((-1 * b - sqrt(delta))) / (2 * a)) - ACC; + dist[1] = (((-1 * b + sqrt(delta))) / (2 * a)) - ACC; + check_for_solutions_para(dist); + } +} diff --git a/src/maths_obj_plane.c b/src/maths_obj_plane.c new file mode 100644 index 0000000..7f173fb --- /dev/null +++ b/src/maths_obj_plane.c @@ -0,0 +1,37 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* maths_obj_plane.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/03 00:45:06 by ntrahy #+# #+# */ +/* Updated: 2017/01/03 00:45:07 by ntrahy ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" +#include + +void get_plane_n(t_ray ray, t_obj *obj, t_thread *thread, double *dist) +{ + t_vect v; + t_vect w; + double a; + double b; + + (void)thread; + a = dot_product_vector(ray.dir, TO_PLANE->normal); + b = 0; + v = ray.ori; + w = TO_PLANE->normal; + if (a != 0) + { + mult_vector(&w, TO_PLANE->dist); + substract_to_vector(&v, w); + b = dot_product_vector(TO_PLANE->normal, v); + dist[0] = -1 * b / a; + dist[1] = dist[0]; + dist[2] = dist[0]; + } +} diff --git a/src/maths_obj_prism.c b/src/maths_obj_prism.c new file mode 100644 index 0000000..f653eb7 --- /dev/null +++ b/src/maths_obj_prism.c @@ -0,0 +1,94 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* maths_obj_prism.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* 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); +} diff --git a/src/maths_obj_sphere.c b/src/maths_obj_sphere.c new file mode 100644 index 0000000..065aaac --- /dev/null +++ b/src/maths_obj_sphere.c @@ -0,0 +1,52 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* maths_obj_sphere.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/03 00:45:18 by ntrahy #+# #+# */ +/* Updated: 2017/01/03 13:54:11 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" +#include + +static void check_for_solutions_sphere(double *dist) +{ + if (dist[0] > dist[1]) + swap_double(&dist[0], &dist[1]); + if (dist[0] < 0 && dist[1] > 0) + dist[2] = dist[1]; + else if (dist[0] > 0 && dist[1] > 0) + dist[2] = dist[0]; + else + { + dist[0] = 0; + dist[1] = 0; + } +} + +void get_sphere_n(t_ray ray, t_obj *obj, t_thread *thread, + double *dist) +{ + double a; + double b; + double c; + double delta; + + (void)thread; + (void)obj; + a = pow(ray.dir.x, 2) + pow(ray.dir.y, 2) + pow(ray.dir.z, 2); + b = (2 * ray.ori.x * ray.dir.x) + (2 * ray.ori.y * ray.dir.y) + + (2 * ray.ori.z * ray.dir.z); + c = pow(ray.ori.x, 2) + pow(ray.ori.y, 2) + pow(ray.ori.z, 2) - 1; + delta = b * b - 4 * a * c; + if (delta > 0) + { + dist[0] = (((-1 * b - sqrt(delta))) / (a + a)) - ACC; + dist[1] = (((-1 * b + sqrt(delta))) / (a + a)) - ACC; + check_for_solutions_sphere(dist); + } +} diff --git a/src/maths_obj_triangle.c b/src/maths_obj_triangle.c new file mode 100644 index 0000000..3ad1867 --- /dev/null +++ b/src/maths_obj_triangle.c @@ -0,0 +1,116 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* maths_obj_triangle.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/03 00:40:29 by ntrahy #+# #+# */ +/* Updated: 2017/01/08 14:57:33 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +static int first_check(t_triangle *t, t_vect n) +{ + t_vect an; + t_vect ab_x_an; + t_vect an_x_ac; + double dot; + + an = init_vector(n.x - t->a.x, + n.y - t->a.y, + n.z - t->a.z, 0); + ab_x_an = cross_product_vector(t->ab, an); + an_x_ac = cross_product_vector(an, t->ac); + dot = dot_product_vector(ab_x_an, an_x_ac); + if (dot >= 0) + return (1); + else + return (0); +} + +static int second_check(t_triangle *t, t_vect n) +{ + t_vect bn; + t_vect ba_x_bn; + t_vect bn_x_bc; + double dot; + + bn = init_vector(n.x - t->b.x, + n.y - t->b.y, + n.z - t->b.z, 0); + ba_x_bn = cross_product_vector(t->ba, bn); + bn_x_bc = cross_product_vector(bn, t->bc); + dot = dot_product_vector(ba_x_bn, bn_x_bc); + if (dot >= 0) + return (1); + else + return (0); +} + +static int third_check(t_triangle *t, t_vect n) +{ + t_vect cn; + t_vect cb_x_cn; + t_vect cn_x_ca; + double dot; + + cn = init_vector(n.x - t->c.x, + n.y - t->c.y, + n.z - t->c.z, 0); + cb_x_cn = cross_product_vector(t->cb, cn); + cn_x_ca = cross_product_vector(cn, t->ca); + dot = dot_product_vector(cb_x_cn, cn_x_ca); + if (dot >= 0) + return (1); + else + return (0); +} + +char is_in_triangle(t_triangle *t, t_ray ray, double dist) +{ + t_vect n_pos; + t_vect tmp_raydir; + + n_pos = ray.ori; + tmp_raydir = ray.dir; + mult_vector(&tmp_raydir, dist); + add_to_vector(&n_pos, tmp_raydir); + if (first_check(t, n_pos) && second_check(t, n_pos) + && third_check(t, n_pos)) + return (1); + else + return (0); +} + +void get_triangle_n(t_ray ray, t_obj *obj, + t_thread *thread, double *dist) +{ + t_vect vector; + t_vect normal; + double dot_dir_normal; + double dot_vector_normal; + double result; + + (void)thread; + dot_dir_normal = dot_product_vector(ray.dir, TO_TRIANGLE->normal); + dot_vector_normal = 0; + vector = ray.ori; + normal = TO_TRIANGLE->normal; + if (dot_dir_normal != 0) + { + mult_vector(&normal, TO_TRIANGLE->distance); + negative_vector(&normal); + add_to_vector(&vector, normal); + dot_vector_normal = dot_product_vector(TO_TRIANGLE->normal, vector); + result = -1 * dot_vector_normal / dot_dir_normal; + if (is_in_triangle(TO_TRIANGLE, ray, result)) + { + dist[0] = result; + dist[1] = result; + dist[2] = result; + } + } +} diff --git a/src/maths_vector_calc.c b/src/maths_vector_calc.c new file mode 100644 index 0000000..bcdaa62 --- /dev/null +++ b/src/maths_vector_calc.c @@ -0,0 +1,54 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* maths_vector_calc.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/03 00:45:27 by ntrahy #+# #+# */ +/* Updated: 2017/01/03 00:45:28 by ntrahy ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" +#include + +t_vect copy_vector(t_vect v) +{ + t_vect v_new; + + v_new.x = v.x; + v_new.y = v.y; + v_new.z = v.z; + v_new.w = v.w; + return (v_new); +} + +void negative_vector(t_vect *v) +{ + v->x *= -1; + v->y *= -1; + v->z *= -1; +} + +double vector_magnitude(t_vect v) +{ + return (sqrt(v.x * v.x + v.y * v.y + v.z * v.z)); +} + +void normalize_vector(t_vect *v) +{ + double magnitude; + + magnitude = vector_magnitude(*v); + v->x /= magnitude; + v->y /= magnitude; + v->z /= magnitude; +} + +void mult_vector(t_vect *v, double d) +{ + v->x *= d; + v->y *= d; + v->z *= d; +} diff --git a/src/maths_vector_op.c b/src/maths_vector_op.c new file mode 100644 index 0000000..886e2ba --- /dev/null +++ b/src/maths_vector_op.c @@ -0,0 +1,55 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* maths_vector_op.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/03 00:45:34 by ntrahy #+# #+# */ +/* Updated: 2017/01/08 12:56:51 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" +#include + +void add_to_vector(t_vect *v1, t_vect v2) +{ + v1->x += v2.x; + v1->y += v2.y; + v1->z += v2.z; +} + +void substract_to_vector(t_vect *v1, t_vect v2) +{ + v1->x -= v2.x; + v1->y -= v2.y; + v1->z -= v2.z; +} + +double dot_product_vector(t_vect v1, t_vect v2) +{ + return (v1.x * v2.x + v1.y * v2.y + v1.z * v2.z); +} + +t_vect cross_product_vector(t_vect v1, t_vect v2) +{ + t_vect cross_product; + + cross_product = init_vector(v1.y * v2.z - v1.z * v2.y, + v1.z * v2.x - v1.x * v2.z, + v1.x * v2.y - v1.y * v2.x, 0); + return (cross_product); +} + +t_vect define_obj_normal(t_record *info, + t_data *d, t_thread *thread) +{ + t_vect obj_normal; + + obj_normal = ((t_vect (*)(t_obj *, t_vect, t_thread *)) + d->func->get_obj_normal[info->type])(info->obj, + info->n_pos, thread); + apply_tf(info->obj, &obj_normal, d, TF_NORMAL); + return (obj_normal); +} diff --git a/src/obj_apply_parameters.c b/src/obj_apply_parameters.c new file mode 100644 index 0000000..10edcdd --- /dev/null +++ b/src/obj_apply_parameters.c @@ -0,0 +1,52 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* obj_apply_parameters.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/11/23 04:57:15 by ntrahy #+# #+# */ +/* Updated: 2017/01/08 13:17:39 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +int tf(char *lolilol, int line, t_p_cache *cache) +{ + (void)cache; + (void)lolilol; + (void)line; + return (1); +} + +void attributeboth(double *xa, double *ya, float xb, float yb) +{ + *xa = xb; + *ya = yb; +} + +void transform(t_tf_list **lst, char *param_name, char **params, + t_p_cache *cache) +{ + if (ft_strcmp(param_name, "translate") == 0 && + chk(params, 3, parsetest_vector, cache)) + push_trans_tf(lst, ft_atof(params[0]), + ft_atof(params[1]), ft_atof(params[2])); + else if (ft_strcmp(param_name, "rotate_x") == 0 && + chk(params, 1, tf, cache)) + push_xrot_tf(lst, ft_atof(params[0])); + else if (ft_strcmp(param_name, "rotate_y") == 0 && + chk(params, 1, tf, cache)) + push_yrot_tf(lst, ft_atof(params[0])); + else if (ft_strcmp(param_name, "rotate_z") == 0 && + chk(params, 1, tf, cache)) + push_zrot_tf(lst, ft_atof(params[0])); + else if (ft_strcmp(param_name, "scale") == 0 && + chk(params, 3, parsetest_vector, cache)) + push_scale_tf(lst, TWO_ATOF, + ft_atof(params[2])); + else + ft_parsing_error(cache->pos, "unsupported parameter passed to object", + cache->filename); +} diff --git a/src/obj_apply_parameters_basic.c b/src/obj_apply_parameters_basic.c new file mode 100644 index 0000000..5391b01 --- /dev/null +++ b/src/obj_apply_parameters_basic.c @@ -0,0 +1,139 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* obj_apply_parameters_basic.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/08 13:07:33 by scebula #+# #+# */ +/* Updated: 2017/01/10 21:24:12 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void manage_sphere_params(t_p_cache *cache, t_sphere *sphere) +{ + disect_param(cache->line, &PARAM_NAME, &PARAMS); + if (ft_strcmp(PARAM_NAME, "color") == 0 && chk(PARAMS, 3, tf, cache)) + sphere->color = set_color(ft_atoi(cache->params[0]), + ft_atoi(cache->params[1]), ft_atoi(cache->params[2])); + else if (ft_strcmp(PARAM_NAME, "shine") == 0 && chk(PARAMS, 1, tf, cache)) + sphere->shine = ft_atof(PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "reflection") == 0 + && chk(PARAMS, 1, tf, cache)) + sphere->reflection = ft_atof(PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "texture") == 0 && chk(PARAMS, 1, tf, cache)) + sphere->texture = get_texture_data(cache->d, PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "bumpmap") == 0 && chk(PARAMS, 1, tf, cache)) + sphere->bumpmap = get_texture_data(cache->d, PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "texmodifier") == 0) + sphere->texmodifier = ft_atoi(PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "texscale") == 0) + attributeboth(&sphere->scale_x, &sphere->scale_y, TWO_ATOF); + else if (ft_strcmp(PARAM_NAME, "texoffset") == 0) + attributeboth(&sphere->off_x, &sphere->off_y, TWO_ATOF); + else + transform(&sphere->tf_list, PARAM_NAME, PARAMS, cache); +} + +void manage_plane_params(t_p_cache *cache, t_plane *plane) +{ + disect_param(CAC->line, &PARAM_NAME, &PARAMS); + if (ft_strcmp(PARAM_NAME, "color") == 0 && chk(PARAMS, 3, tf, CAC)) + plane->color = set_color(ft_atoi(cache->params[0]), + ft_atoi(cache->params[1]), ft_atoi(cache->params[2])); + else if (ft_strcmp(PARAM_NAME, "shine") == 0 && chk(PARAMS, 1, tf, CAC)) + plane->shine = ft_atof(PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "reflection") == 0 + && chk(PARAMS, 1, tf, CAC)) + plane->reflection = ft_atof(PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "texture") == 0 && chk(PARAMS, 1, tf, CAC)) + plane->texture = get_texture_data(CAC->d, PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "bumpmap") == 0 && chk(PARAMS, 1, tf, CAC)) + plane->bumpmap = get_texture_data(CAC->d, PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "texmodifier") == 0) + plane->texmodifier = ft_atoi(PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "texscale") == 0) + attributeboth(&plane->scale_x, &plane->scale_y, TWO_ATOF); + else if (ft_strcmp(PARAM_NAME, "texoffset") == 0) + attributeboth(&plane->off_x, &plane->off_y, TWO_ATOF); + else if (ft_strcmp(PARAM_NAME, "absolute") == 0 && chk(PARAMS, 1, tf, CAC)) + plane->cut_type = ft_atoi(PARAMS[0]); + else + transform(&plane->tf_list, PARAM_NAME, PARAMS, CAC); +} + +void manage_cylinder_params(t_p_cache *cache, t_cylinder *cylinder) +{ + disect_param(cache->line, &PARAM_NAME, &PARAMS); + if (ft_strcmp(PARAM_NAME, "color") == 0 && chk(PARAMS, 3, tf, cache)) + cylinder->color = set_color(ft_atoi(cache->params[0]), + ft_atoi(cache->params[1]), ft_atoi(cache->params[2])); + else if (ft_strcmp(PARAM_NAME, "shine") == 0 && chk(PARAMS, 1, tf, cache)) + cylinder->shine = ft_atof(PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "reflection") == 0 + && chk(PARAMS, 1, tf, cache)) + cylinder->reflection = ft_atof(PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "texture") == 0 && chk(PARAMS, 1, tf, cache)) + cylinder->texture = get_texture_data(cache->d, PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "bumpmap") == 0 && chk(PARAMS, 1, tf, cache)) + cylinder->bumpmap = get_texture_data(cache->d, PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "texmodifier") == 0) + cylinder->texmodifier = ft_atoi(PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "texscale") == 0) + attributeboth(&cylinder->scale_x, &cylinder->scale_y, TWO_ATOF); + else if (ft_strcmp(PARAM_NAME, "texoffset") == 0) + attributeboth(&cylinder->off_x, &cylinder->off_y, TWO_ATOF); + else + transform(&cylinder->tf_list, PARAM_NAME, PARAMS, cache); +} + +void manage_cone_params(t_p_cache *cache, t_cone *cone) +{ + disect_param(cache->line, &PARAM_NAME, &PARAMS); + if (ft_strcmp(PARAM_NAME, "color") == 0 && chk(PARAMS, 3, tf, cache)) + cone->color = set_color(ft_atoi(cache->params[0]), + ft_atoi(cache->params[1]), ft_atoi(cache->params[2])); + else if (ft_strcmp(PARAM_NAME, "shine") == 0 && chk(PARAMS, 1, tf, cache)) + cone->shine = ft_atof(PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "reflection") == 0 + && chk(PARAMS, 1, tf, cache)) + cone->reflection = ft_atof(PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "texture") == 0 && chk(PARAMS, 1, tf, cache)) + cone->texture = get_texture_data(cache->d, PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "bumpmap") == 0 && chk(PARAMS, 1, tf, cache)) + cone->bumpmap = get_texture_data(cache->d, PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "texmodifier") == 0) + cone->texmodifier = ft_atoi(PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "texscale") == 0) + attributeboth(&cone->scale_x, &cone->scale_y, TWO_ATOF); + else if (ft_strcmp(PARAM_NAME, "texoffset") == 0) + attributeboth(&cone->off_x, &cone->off_y, TWO_ATOF); + else + transform(&cone->tf_list, PARAM_NAME, PARAMS, cache); +} + +void manage_triangle_params(t_p_cache *cache, t_triangle *triangle) +{ + disect_param(cache->line, &PARAM_NAME, &PARAMS); + if (ft_strcmp(PARAM_NAME, "color") == 0 && chk(PARAMS, 3, tf, cache)) + triangle->color = set_color(ft_atoi(cache->params[0]), + ft_atoi(cache->params[1]), ft_atoi(cache->params[2])); + else if (ft_strcmp(PARAM_NAME, "shine") == 0 && chk(PARAMS, 1, tf, cache)) + triangle->shine = ft_atof(PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "reflection") == 0 + && chk(PARAMS, 1, tf, cache)) + triangle->reflection = ft_atof(PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "vertex_a") == 0 + && chk(PARAMS, 3, parsetest_vector, cache)) + triangle->a = init_vector(TWO_ATOF, ft_atof(PARAMS[2]), 1); + else if (ft_strcmp(PARAM_NAME, "vertex_b") == 0 + && chk(PARAMS, 3, parsetest_vector, cache)) + triangle->b = init_vector(TWO_ATOF, ft_atof(PARAMS[2]), 1); + else if (ft_strcmp(PARAM_NAME, "vertex_c") == 0 + && chk(PARAMS, 3, parsetest_vector, cache)) + triangle->c = init_vector(TWO_ATOF, ft_atof(PARAMS[2]), 1); + else + transform(&triangle->tf_list, PARAM_NAME, PARAMS, cache); +} diff --git a/src/obj_apply_parameters_complex.c b/src/obj_apply_parameters_complex.c new file mode 100644 index 0000000..9608a29 --- /dev/null +++ b/src/obj_apply_parameters_complex.c @@ -0,0 +1,113 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* obj_apply_parameters_complex.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/08 13:08:44 by scebula #+# #+# */ +/* Updated: 2017/01/10 21:24:57 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void manage_paraboloid_params(t_p_cache *cache, t_paraboloid *paraboloid) +{ + disect_param(cache->line, &PARAM_NAME, &PARAMS); + if (ft_strcmp(PARAM_NAME, "color") == 0 && chk(PARAMS, 3, tf, cache)) + paraboloid->color = set_color(ft_atoi(cache->params[0]), + ft_atoi(cache->params[1]), ft_atoi(cache->params[2])); + else if (ft_strcmp(PARAM_NAME, "shine") == 0 && chk(PARAMS, 1, tf, cache)) + paraboloid->shine = ft_atof(PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "reflection") == 0 + && chk(PARAMS, 1, tf, cache)) + paraboloid->reflection = ft_atof(PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "texture") == 0 && chk(PARAMS, 1, tf, cache)) + paraboloid->texture = get_texture_data(cache->d, PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "bumpmap") == 0 && chk(PARAMS, 1, tf, cache)) + paraboloid->bumpmap = get_texture_data(cache->d, PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "texmodifier") == 0) + paraboloid->texmodifier = ft_atoi(PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "texscale") == 0) + attributeboth(¶boloid->scale_x, ¶boloid->scale_y, TWO_ATOF); + else if (ft_strcmp(PARAM_NAME, "texoffset") == 0) + attributeboth(¶boloid->off_x, ¶boloid->off_y, TWO_ATOF); + else + transform(¶boloid->tf_list, PARAM_NAME, PARAMS, cache); +} + +void manage_hyperboloid_params(t_p_cache *cache, t_hyperboloid *hyperboloid) +{ + disect_param(CAC->line, &PARAM_NAME, &PARAMS); + if (ft_strcmp(PARAM_NAME, "color") == 0 && chk(PARAMS, 3, tf, CAC)) + hyperboloid->color = set_color(ft_atoi(cache->params[0]), + ft_atoi(cache->params[1]), ft_atoi(cache->params[2])); + else if (ft_strcmp(PARAM_NAME, "shine") == 0 && chk(PARAMS, 1, tf, CAC)) + hyperboloid->shine = ft_atof(PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "reflection") == 0 + && chk(PARAMS, 1, tf, CAC)) + hyperboloid->reflection = ft_atof(PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "texture") == 0 && chk(PARAMS, 1, tf, CAC)) + hyperboloid->texture = get_texture_data(CAC->d, PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "bumpmap") == 0 && chk(PARAMS, 1, tf, CAC)) + hyperboloid->bumpmap = get_texture_data(CAC->d, PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "sheetmode") == 0 && chk(PARAMS, 1, tf, CAC)) + hyperboloid->sheets = ft_atoi(PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "texmodifier") == 0) + hyperboloid->texmodifier = ft_atoi(PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "texscale") == 0) + attributeboth(&hyperboloid->scale_x, &hyperboloid->scale_y, TWO_ATOF); + else if (ft_strcmp(PARAM_NAME, "texoffset") == 0) + attributeboth(&hyperboloid->off_x, &hyperboloid->off_y, TWO_ATOF); + else + transform(&hyperboloid->tf_list, PARAM_NAME, PARAMS, CAC); +} + +void manage_cube_params(t_p_cache *cache, t_cube *cube) +{ + disect_param(cache->line, &PARAM_NAME, &PARAMS); + if (ft_strcmp(PARAM_NAME, "color") == 0 && chk(PARAMS, 3, tf, cache)) + cube->color = set_color(ft_atoi(cache->params[0]), + ft_atoi(cache->params[1]), ft_atoi(cache->params[2])); + else if (ft_strcmp(PARAM_NAME, "shine") == 0 && chk(PARAMS, 1, tf, cache)) + cube->shine = ft_atof(PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "reflection") == 0 + && chk(PARAMS, 1, tf, cache)) + cube->reflection = ft_atof(PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "vertex_a") == 0 + && chk(PARAMS, 3, parsetest_vector, cache)) + cube->corner1 = init_vector(TWO_ATOF, ft_atof(PARAMS[2]), 1); + else if (ft_strcmp(PARAM_NAME, "vertex_b") == 0 + && chk(PARAMS, 3, parsetest_vector, cache)) + cube->corner2 = init_vector(TWO_ATOF, ft_atof(PARAMS[2]), 1); + else + transform(&cube->tf_list, PARAM_NAME, PARAMS, cache); +} + +void manage_prism_params(t_p_cache *cache, t_prism *prism) +{ + disect_param(cache->line, &PARAM_NAME, &PARAMS); + if (ft_strcmp(PARAM_NAME, "color") == 0 && chk(PARAMS, 3, tf, cache)) + prism->color = set_color(ft_atoi(cache->params[0]), + ft_atoi(cache->params[1]), ft_atoi(cache->params[2])); + else if (ft_strcmp(PARAM_NAME, "shine") == 0 && chk(PARAMS, 1, tf, cache)) + prism->shine = ft_atof(PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "reflection") == 0 + && chk(PARAMS, 1, tf, cache)) + prism->reflection = ft_atof(PARAMS[0]); + else if (ft_strcmp(PARAM_NAME, "vertex_a") == 0 + && chk(PARAMS, 3, parsetest_vector, cache)) + prism->a = init_vector(TWO_ATOF, ft_atof(PARAMS[2]), 1); + else if (ft_strcmp(PARAM_NAME, "vertex_b") == 0 + && chk(PARAMS, 3, parsetest_vector, cache)) + prism->b = init_vector(TWO_ATOF, ft_atof(PARAMS[2]), 1); + else if (ft_strcmp(PARAM_NAME, "vertex_c") == 0 + && chk(PARAMS, 3, parsetest_vector, cache)) + prism->c = init_vector(TWO_ATOF, ft_atof(PARAMS[2]), 1); + else if (ft_strcmp(PARAM_NAME, "vertex_d") == 0 + && chk(PARAMS, 3, parsetest_vector, cache)) + prism->d = init_vector(TWO_ATOF, ft_atof(PARAMS[2]), 1); + else + transform(&prism->tf_list, PARAM_NAME, PARAMS, cache); +} diff --git a/src/obj_parameter_parser.c b/src/obj_parameter_parser.c new file mode 100644 index 0000000..e6c53c5 --- /dev/null +++ b/src/obj_parameter_parser.c @@ -0,0 +1,51 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* obj_parameter_parser.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/11/23 04:57:25 by ntrahy #+# #+# */ +/* Updated: 2017/01/08 14:54:50 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +char get_number_split(char **argc) +{ + int i; + + i = 0; + while (argc[i] != 0) + i++; + return (i); +} + +void disect_param(char *str, char **param, char ***args) +{ + int i; + + i = 0; + while (str[i] != ':' && str[i] != '\0') + i++; + *param = ft_strndup(str, i); + *args = ft_strsplit_whitespaces(&str[1 + i]); +} + +char chk(char **params, int n, int (*f)(char *, int, struct s_p_cache *), + t_p_cache *cache) +{ + int i; + + i = 0; + if (n < get_number_split(params)) + return (0); + while (*params != 0) + { + f(*params, POS, cache); + i = 0; + params++; + } + return (1); +} diff --git a/src/objects_populators_basic.c b/src/objects_populators_basic.c new file mode 100644 index 0000000..39e3b8b --- /dev/null +++ b/src/objects_populators_basic.c @@ -0,0 +1,141 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* objects_populators_basic.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/08 13:02:02 by scebula #+# #+# */ +/* Updated: 2017/01/08 13:02:44 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void populatesphere(int fd, t_p_cache *cache, t_obj **lst) +{ + t_sphere *sphere; + char lineid; + t_obj *obj; + + sphere = init_sphere(1); + while ((cache->linelen = get_next_line(fd, &cache->line)) > 0) + { + POS++; + lineid = line_identifier(cache); + if (lineid == CONTEXT_CLOSER) + break ; + else if (lineid == DECLARATOR && ft_strncmp("CUT", cache->line, 3) == 0 + && cache->scope == 1) + declarator_redirect(fd, cache, NULL, &sphere->cut); + else if (lineid == DECLARATOR) + ft_parsing_error(POS, "sphere cannot support items", FN); + else if (lineid == PARAMETER) + manage_sphere_params(cache, sphere); + free(cache->line); + } + obj = push_sphere(lst, sphere); +} + +void populatecylinder(int fd, t_p_cache *cache, t_obj **lst) +{ + t_cylinder *cylinder; + char lineid; + t_obj *obj; + + cylinder = init_cylinder(); + while ((cache->linelen = get_next_line(fd, &cache->line)) > 0) + { + POS++; + lineid = line_identifier(cache); + if (lineid == CONTEXT_CLOSER) + break ; + else if (lineid == DECLARATOR && ft_strncmp("CUT", cache->line, 3) == 0 + && cache->scope == 1) + declarator_redirect(fd, cache, NULL, &cylinder->cut); + else if (lineid == DECLARATOR) + ft_parsing_error(POS, "cylinder cannot support items", FN); + else if (lineid == PARAMETER) + manage_cylinder_params(cache, cylinder); + free(cache->line); + } + obj = push_cylinder(lst, cylinder); +} + +void populatecone(int fd, t_p_cache *cache, t_obj **lst) +{ + t_cone *cone; + char lineid; + t_obj *obj; + + if (cache->scope > 1) + ft_parsing_error(POS, "cone does not support CSG", FN); + cone = init_cone(10); + while ((cache->linelen = get_next_line(fd, &cache->line)) > 0) + { + POS++; + lineid = line_identifier(cache); + if (lineid == CONTEXT_CLOSER) + break ; + else if (lineid == DECLARATOR && ft_strncmp("CUT", cache->line, 3) == 0 + && cache->scope == 1) + declarator_redirect(fd, cache, NULL, &cone->cut); + else if (lineid == DECLARATOR) + ft_parsing_error(POS, "cone cannot support items", FN); + else if (lineid == PARAMETER) + manage_cone_params(cache, cone); + free(cache->line); + } + obj = push_cone(lst, cone); +} + +void populateplane(int fd, t_p_cache *cache, t_obj **lst) +{ + t_plane *plane; + char lineid; + t_obj *obj; + + plane = init_plane(); + while ((cache->linelen = get_next_line(fd, &cache->line)) > 0) + { + POS++; + lineid = line_identifier(cache); + if (lineid == CONTEXT_CLOSER) + break ; + else if (lineid == DECLARATOR && ft_strncmp("CUT", cache->line, 3) == 0 + && cache->scope == 1) + declarator_redirect(fd, cache, NULL, &plane->cut); + else if (lineid == DECLARATOR) + ft_parsing_error(POS, "plane cannot support items", FN); + else if (lineid == PARAMETER) + manage_plane_params(cache, plane); + free(cache->line); + } + obj = push_plane(lst, plane); +} + +void populatetriangle(int fd, t_p_cache *cache, t_obj **lst) +{ + t_triangle *triangle; + char lineid; + t_obj *obj; + + triangle = init_triangle(); + while ((cache->linelen = get_next_line(fd, &cache->line)) > 0) + { + POS++; + lineid = line_identifier(cache); + if (lineid == CONTEXT_CLOSER) + break ; + else if (lineid == DECLARATOR && ft_strncmp("CUT", cache->line, 3) == 0 + && cache->scope == 1) + declarator_redirect(fd, cache, NULL, &triangle->cut); + else if (lineid == DECLARATOR) + ft_parsing_error(POS, "triangle cannot support items", FN); + else if (lineid == PARAMETER) + manage_triangle_params(cache, triangle); + free(cache->line); + } + compute_triangle(triangle); + obj = push_triangle(lst, triangle); +} diff --git a/src/objects_populators_complex.c b/src/objects_populators_complex.c new file mode 100644 index 0000000..c27aa48 --- /dev/null +++ b/src/objects_populators_complex.c @@ -0,0 +1,142 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* objects_populators_complex.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/08 13:03:15 by scebula #+# #+# */ +/* Updated: 2017/01/08 13:03:40 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void populateprism(int fd, t_p_cache *cache, t_obj **lst) +{ + t_prism *prism; + char lineid; + t_obj *obj; + + prism = init_prism(); + while ((cache->linelen = get_next_line(fd, &cache->line)) > 0) + { + POS++; + lineid = line_identifier(cache); + if (lineid == CONTEXT_CLOSER) + break ; + else if (lineid == DECLARATOR && ft_strncmp("CUT", cache->line, 3) == 0 + && cache->scope == 1) + declarator_redirect(fd, cache, NULL, &prism->cut); + else if (lineid == DECLARATOR) + ft_parsing_error(POS, "prism cannot support items", FN); + else if (lineid == PARAMETER) + manage_prism_params(cache, prism); + free(cache->line); + } + compute_prism(prism); + obj = push_prism(lst, prism); +} + +void populatecube(int fd, t_p_cache *cache, t_obj **lst) +{ + t_cube *cube; + char lineid; + t_obj *obj; + + cube = init_cube(); + while ((cache->linelen = get_next_line(fd, &cache->line)) > 0) + { + POS++; + lineid = line_identifier(cache); + if (lineid == CONTEXT_CLOSER) + break ; + else if (lineid == DECLARATOR && ft_strncmp("CUT", cache->line, 3) == 0 + && cache->scope == 1) + declarator_redirect(fd, cache, NULL, &cube->cut); + else if (lineid == DECLARATOR) + ft_parsing_error(POS, "cube cannot support items", FN); + else if (lineid == PARAMETER) + manage_cube_params(cache, cube); + free(cache->line); + } + compute_cube(cube); + obj = push_cube(lst, cube); +} + +void populateparaboloid(int fd, t_p_cache *cache, t_obj **lst) +{ + t_paraboloid *paraboloid; + char lineid; + t_obj *obj; + + paraboloid = init_paraboloid(); + while ((cache->linelen = get_next_line(fd, &cache->line)) > 0) + { + POS++; + lineid = line_identifier(cache); + if (lineid == CONTEXT_CLOSER) + break ; + else if (lineid == DECLARATOR && ft_strncmp("CUT", cache->line, 3) == 0 + && cache->scope == 1) + declarator_redirect(fd, cache, NULL, ¶boloid->cut); + else if (lineid == DECLARATOR) + ft_parsing_error(POS, "paraboloid cannot support items", FN); + else if (lineid == PARAMETER) + manage_paraboloid_params(cache, paraboloid); + free(cache->line); + } + obj = push_paraboloid(lst, paraboloid); +} + +void populatehyperboloid(int fd, t_p_cache *cache, t_obj **lst) +{ + t_hyperboloid *hyperboloid; + char lineid; + t_obj *obj; + + if (cache->scope > 1) + ft_parsing_error(POS, "hyperboloid does not support CSG", FN); + hyperboloid = init_hyperboloid(1); + while ((cache->linelen = get_next_line(fd, &cache->line)) > 0) + { + POS++; + lineid = line_identifier(cache); + if (lineid == CONTEXT_CLOSER) + break ; + else if (lineid == DECLARATOR) + ft_parsing_error(POS, "hyperboloid cannot support items", FN); + else if (lineid == PARAMETER) + manage_hyperboloid_params(cache, hyperboloid); + free(cache->line); + } + obj = push_hyperboloid(lst, hyperboloid); +} + +void populatecsg(int fd, t_p_cache *cache, t_obj **lst, char booleantype) +{ + t_csg *csg; + char lineid; + t_obj *obj; + + csg = init_csg(); + csg->operation = booleantype; + while ((cache->linelen = get_next_line(fd, &cache->line)) > 0) + { + POS++; + lineid = line_identifier(cache); + if (lineid == CONTEXT_CLOSER) + break ; + else if (lineid == DECLARATOR && csg->first != NULL + && csg->second != NULL) + ft_parsing_error(POS, "csg only support two child", FN); + else if (lineid == DECLARATOR && csg->first == NULL) + declarator_redirect(fd, cache, &csg->first, NULL); + else if (lineid == DECLARATOR && csg->second == NULL) + declarator_redirect(fd, cache, &csg->second, NULL); + free(cache->line); + } + if (csg->first == NULL || csg->second == NULL) + ft_parsing_error(POS, "csg only support two child", FN); + obj = push_csg(lst, csg); +} diff --git a/src/parameter_input_testers.c b/src/parameter_input_testers.c new file mode 100644 index 0000000..e609634 --- /dev/null +++ b/src/parameter_input_testers.c @@ -0,0 +1,33 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* parameter_input_testers.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/03 15:08:27 by scebula #+# #+# */ +/* Updated: 2017/01/03 15:09:35 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +int parsetest_vector(char *line, int linenbr, t_p_cache *cache) +{ + int i; + float tmp; + + i = 0; + while (line[i] != 0) + { + if (ft_isnumeric(line[i]) == 0) + ft_parsing_error(linenbr, + "found non numeric character where float was expected", FN); + i++; + } + tmp = ft_atof(line); + if (tmp > 100000 || tmp < -100000) + ft_parsing_error(linenbr, + "error parsing a float vector over 100000", FN); + return (1); +} diff --git a/src/parser.c b/src/parser.c new file mode 100644 index 0000000..7eac3ba --- /dev/null +++ b/src/parser.c @@ -0,0 +1,105 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* parser.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/11/02 18:30:23 by ntrahy #+# #+# */ +/* Updated: 2017/01/08 14:58:04 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void cache_init(t_p_cache *cache, char *filename) +{ + cache->pos = 1; + cache->scope = 0; + cache->line = NULL; + cache->linelen = 0; + cache->prec = 0; + cache->d = NULL; + cache->param_name = NULL; + cache->params = NULL; + FN = filename; +} + +char getboolop(t_p_cache *cache) +{ + char *tmp; + char booltype; + + booltype = 0; + tmp = ft_strchr(cache->line, ','); + if (ft_strcmp(",UNION", tmp) == 0) + booltype = UNION; + else if (ft_strcmp(",INTER", tmp) == 0) + booltype = INTER; + else if (ft_strcmp(",DIFF", tmp) == 0) + booltype = DIFF; + else + ft_parsing_error(cache->pos, + "boolean operation for csg is inconsistant", FN); + return (booltype); +} + +void dec_redir_2(int fd, t_p_cache *cache, t_obj **lst, t_obj **cut) +{ + if (ft_strncmp("CUBE", cache->line, 4) == 0) + populatecube(fd, cache, lst); + else if (ft_strncmp("PARABOLOID", cache->line, 10) == 0) + populateparaboloid(fd, cache, lst); + else if (ft_strncmp("HYPERBOLOID", cache->line, 11) == 0) + populatehyperboloid(fd, cache, lst); + else if (ft_strncmp("LIGHT", cache->line, 5) == 0) + populatelight(fd, cache, &cache->d->light_list); + else if (ft_strncmp("CAMERA", cache->line, 6) == 0) + populatecamera(fd, cache); + else if (ft_strncmp("CSG", cache->line, 3) == 0) + populatecsg(fd, cache, lst, getboolop(cache)); + else if (ft_strncmp("CUT", cache->line, 3) == 0 && cut != NULL) + populateplane(fd, cache, cut); + else + ft_parsing_error(cache->pos, "unrecognised declarator", FN); +} + +void declarator_redirect(int fd, t_p_cache *cache, t_obj **lst, t_obj **cut) +{ + free_prec_split(cache); + cache->scope++; + if (ft_strncmp("SPHERE", cache->line, 6) == 0) + populatesphere(fd, cache, lst); + else if (ft_strncmp("CYLINDER", cache->line, 8) == 0) + populatecylinder(fd, cache, lst); + else if (ft_strncmp("CONE", cache->line, 4) == 0) + populatecone(fd, cache, lst); + else if (ft_strncmp("PLANE", cache->line, 5) == 0) + populateplane(fd, cache, lst); + else if (ft_strncmp("TRIANGLE", cache->line, 7) == 0) + populatetriangle(fd, cache, lst); + else if (ft_strncmp("PRISM", cache->line, 5) == 0) + populateprism(fd, cache, lst); + else + dec_redir_2(fd, cache, lst, cut); + cache->scope--; +} + +void parser(int fd, t_data *d, char *filename) +{ + t_p_cache cache; + char lineid; + + cache_init(&cache, filename); + cache.d = d; + while ((cache.linelen = get_next_line(fd, &cache.line)) > 0) + { + cache.pos++; + lineid = line_identifier(&cache); + if (lineid == DECLARATOR) + declarator_redirect(fd, &cache, &(d->obj), NULL); + else if (lineid == PARAMETER) + manage_root_parameters(&cache, d); + free(cache.line); + } +} diff --git a/src/parser_check.c b/src/parser_check.c new file mode 100644 index 0000000..ca13fe7 --- /dev/null +++ b/src/parser_check.c @@ -0,0 +1,63 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* parser_check.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/08 14:47:44 by scebula #+# #+# */ +/* Updated: 2017/01/08 14:52:53 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +int one_double_required(char *name) +{ + return (ft_strcmp("reflection", name) == 0 + || ft_strcmp("transparence", name) == 0 + || ft_strcmp("ambient", name) == 0 + || ft_strcmp("anti-aliasing", name) == 0 + || ft_strcmp("rotate_x", name) == 0 + || ft_strcmp("rotate_y", name) == 0 + || ft_strcmp("rotate_z", name) == 0 + || ft_strcmp("shine", name) == 0 + || ft_strcmp("sheetmode", name) == 0 + || ft_strcmp("AAlvl", name) == 0 + || ft_strcmp("reflections", name) == 0\ + || ft_strcmp("offset_x", name) == 0 + || ft_strcmp("offset_y", name) == 0 + || ft_strcmp("texmodifier", name) == 0 + || ft_strcmp("absolute", name) == 0); +} + +int three_double_required(char *name) +{ + return (ft_strcmp("translate", name) == 0 + || ft_strcmp("color", name) == 0 + || ft_strcmp("position", name) == 0 + || ft_strcmp("orientation", name) == 0 + || ft_strcmp("vertex_a", name) == 0 + || ft_strcmp("vertex_b", name) == 0 + || ft_strcmp("vertex_c", name) == 0 + || ft_strcmp("vertex_d", name) == 0 + || ft_strcmp("scale", name) == 0 + || ft_strcmp("look_at", name) == 0); +} + +int accepted_types(char *str, int scope) +{ + return (ft_strncmp("SPHERE", str, 6) != 0 + && ft_strncmp("CONE", str, 4) != 0 + && ft_strncmp("CYLINDER", str, 8) != 0 + && ft_strncmp("PLANE", str, 5) != 0 + && ft_strncmp("PRISM", str, 5) != 0 + && ft_strncmp("TRIANGLE", str, 6) != 0 + && ft_strncmp("CUBE", str, 4) != 0 + && ft_strncmp("PARABOLOID", str, 10) != 0 + && ft_strncmp("HYPERBOLOID", str, 11) != 0 + && ft_strncmp("CUT", str, 3) != 0 + && (ft_strncmp("CAMERA", str, 4) != 0 || scope > 1) + && (ft_strncmp("LIGHT", str, 5) != 0 || scope > 1) + && ft_strncmp("CSG", str, 3) != 0); +} diff --git a/src/parser_lexer.c b/src/parser_lexer.c new file mode 100644 index 0000000..248e754 --- /dev/null +++ b/src/parser_lexer.c @@ -0,0 +1,83 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* parser_lexer.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/11/23 04:56:50 by ntrahy #+# #+# */ +/* Updated: 2017/01/08 14:58:12 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void free_prec_split(t_p_cache *cache) +{ + void *back; + + back = PARAMS; + if (PARAM_NAME != NULL) + { + free(PARAM_NAME); + PARAM_NAME = NULL; + } + if (PARAMS != NULL) + { + while (*PARAMS != NULL) + { + free(*PARAMS); + *PARAMS = NULL; + PARAMS++; + } + free(back); + PARAMS = NULL; + } +} + +char isempty(char *str) +{ + if (str == NULL) + return (1); + while (*str != 0) + { + if (*str != 9 && *str != 32) + return (0); + str++; + } + return (1); +} + +int check_line(t_p_cache *cache) +{ + char lineid; + + lineid = line_identifier(cache); + if (lineid == CONTEXT_OPENER) + cache->scope++; + else if (lineid == CONTEXT_CLOSER) + cache->scope--; + if ((cache->prec == DECLARATOR && lineid == CONTEXT_OPENER) + || (lineid == CONTEXT_CLOSER && cache->scope >= 0) + || lineid == PARAMETER || lineid == DECLARATOR || lineid == 0) + { + cache->prec = lineid; + return (1); + } + return (0); +} + +void lexer(int fd, char *filename) +{ + t_p_cache cache; + + cache_init(&cache, filename); + while ((cache.linelen = get_next_line(fd, &cache.line)) > 0) + { + if (check_line(&cache) != 1) + ft_parsing_error(cache.pos, "lexical inconsistency detected", + cache.filename); + cache.pos++; + free(cache.line); + } +} diff --git a/src/parser_line_identifier.c b/src/parser_line_identifier.c new file mode 100644 index 0000000..4daee6e --- /dev/null +++ b/src/parser_line_identifier.c @@ -0,0 +1,107 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* parser_line_identifier.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/03 15:40:38 by scebula #+# #+# */ +/* Updated: 2017/01/08 14:47:55 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +char isdeclarator(char *str, int scope) +{ + if (accepted_types(str, scope)) + return (0); + if (ft_strncmp("CSG", str, 3) != 0) + return (1); + else if ((str = ft_strchr(str, ',')) == 0) + return (0); + str++; + if (!(ft_strcmp("UNION", str) == 0 || ft_strcmp("INTER", str) == 0 + || ft_strcmp("DIFF", str) == 0)) + return (0); + return (1); +} + +char check_param_valid(char *name, int *paramtype) +{ + *paramtype = DOUBLE; + if (three_double_required(name)) + return (3); + if (one_double_required(name)) + return (1); + if (ft_strcmp("texscale", name) == 0 || ft_strcmp("texoffset", name) == 0) + return (2); + *paramtype = STRING; + if (ft_strcmp("light_type", name) == 0 || ft_strcmp("texture", name) == 0 + || ft_strcmp("bumpmap", name) == 0) + return (1); + return (-1); +} + +int get_words_qty(char *str) +{ + char prec; + int words; + int tmp; + + words = 0; + prec = 0; + while (str[0] != '\0') + { + tmp = ft_isnumeric(str[0]); + if (tmp != 0 && prec == 0) + { + words++; + prec = 1; + } + if (tmp == 0 && prec == 1) + prec = 0; + str++; + } + return (words); +} + +char isparameter(char *str, int line, char *filename) +{ + char *delimiter; + char params; + int paramtype; + + if ((delimiter = ft_strchr(str, ':')) == NULL) + return (0); + *delimiter = '\0'; + delimiter++; + if ((params = check_param_valid(str, ¶mtype)) < 0) + ft_parsing_error(line, "unrecognised parameter", filename); + if (get_words_qty(delimiter) != params) + ft_parsing_error(line, "inconsistent number of arguments", filename); + while (*delimiter != 0) + { + if (paramtype == DOUBLE && ft_isalpha(delimiter[0]) == 1) + ft_parsing_error(line, "inconsistent type of arguments", filename); + delimiter++; + } + return (1); +} + +char line_identifier(t_p_cache *cache) +{ + if (ft_strncmp(cache->line, "//", 2) == 0) + return (0); + else if (ft_strcmp(cache->line, "{") == 0) + return (CONTEXT_OPENER); + else if (ft_strcmp(cache->line, "}") == 0) + return (CONTEXT_CLOSER); + else if (isdeclarator(cache->line, cache->scope) == 1) + return (DECLARATOR); + else if (isparameter(cache->line, cache->pos, FN) == 1) + return (PARAMETER); + else if (isempty(cache->line) == 0) + ft_parsing_error(cache->pos, "unrecognised line", FN); + return (0); +} diff --git a/src/post_pro_eblouissement.c b/src/post_pro_eblouissement.c new file mode 100644 index 0000000..40cbcad --- /dev/null +++ b/src/post_pro_eblouissement.c @@ -0,0 +1,138 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* post_pro_eblouissement.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/03 00:45:52 by ntrahy #+# #+# */ +/* Updated: 2017/01/07 14:42:09 by gbrochar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void copy_light(t_light **alist, t_light seen) +{ + t_light *new; + t_light *list; + + list = *alist; + new = init_light(); + new->pos.x = seen.pos.x; + new->pos.y = seen.pos.y; + new->pos.z = seen.pos.z; + new->color.r = seen.color.r; + new->color.g = seen.color.g; + new->color.b = seen.color.b; + if (list) + { + while (list->next) + list = list->next; + list->next = new; + } + else + *alist = new; +} + +t_obj *find_hit_light(t_ray ray, t_data *d, double dist, t_thread *thread) +{ + t_research r; + t_obj *tmp_current; + + ray.dir.w = 0; + init_var(&r, ray); + r.current_obj = d->obj; + while (r.current_obj) + { + tmp_current = r.current_obj; + r.modified_ray = ray; + find_n_dist(&r, d, thread); + if ((r.dist[2] > r.final_dist && r.final_dist == 0 + && r.dist[2] > ACC) || (r.dist[2] < r.final_dist && + r.final_dist > 0 && r.dist[2] > ACC)) + { + r.final_dist = r.dist[2]; + r.closest_obj = r.current_obj; + r.final_ray = r.modified_ray; + } + if (tmp_current->next == NULL + && r.final_dist > ACC && dist > r.final_dist) + return (r.closest_obj); + r.current_obj = tmp_current->next; + } + return (NULL); +} + +t_light *get_visible_lights(t_data *d) +{ + t_light *tmp; + t_light *new_list; + t_ray tlr; + double dist; + + new_list = NULL; + tmp = d->light_list; + while (tmp) + { + tlr = init_ray(d->cam.pos, tmp->pos); + substract_to_vector(&(tlr.dir), tlr.ori); + dist = vector_magnitude(tlr.dir); + normalize_vector(&(tlr.dir)); + if (dot_product_vector(tlr.dir, d->cam.dir) > 0) + if (!(find_hit_light(tlr, d, dist, NULL))) + copy_light(&new_list, *tmp); + tmp = tmp->next; + } + return (new_list); +} + +t_color foreach_light_dist(t_ray ray, t_light *lst, t_color boost) +{ + t_light *tmp; + t_color lol; + double dist; + t_vect tmpmaggle; + t_ray tmp_ray; + + tmp = lst; + while (tmp) + { + tmp_ray = init_ray(ray.ori, ray.dir); + tmpmaggle = tmp->pos; + substract_to_vector(&tmpmaggle, tmp_ray.ori); + mult_vector(&tmp_ray.dir, dot_product_vector(tmp_ray.dir, tmpmaggle)); + substract_to_vector(&tmp_ray.dir, tmpmaggle); + dist = vector_magnitude(tmp_ray.dir); + lol = copy_color(tmp->color); + color_scale(&lol, 1 / (5 * dist)); + color_add(&boost, lol); + tmp = tmp->next; + } + return (boost); +} + +void add_eblouissement(t_data *d) +{ + t_light *iseeyou; + t_ray ray; + t_color boost; + int x; + int y; + + iseeyou = get_visible_lights(d); + x = -1; + while (++x < d->width) + { + y = -1; + while (++y < d->height) + { + ray = calculate_ray(d, x, y, NULL); + boost = img_pull_pixel(x, y, d->img); + boost = foreach_light_dist(ray, iseeyou, boost); + putpixel(x, y, get_color(boost), d->img); + } + } + mlx_clear_window(d->mlx, d->win); + mlx_put_image_to_window(d->mlx, d->win, d->img->img, 0, 0); +} diff --git a/src/post_pro_hub.c b/src/post_pro_hub.c new file mode 100644 index 0000000..0cf604c --- /dev/null +++ b/src/post_pro_hub.c @@ -0,0 +1,76 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* post_pro_hub.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/11/23 04:57:41 by ntrahy #+# #+# */ +/* Updated: 2017/01/08 15:30:58 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +t_color img_pull_pixel(int x, int y, t_img *img) +{ + t_color c; + + if (img->x && img->y) + { + while (x < 0) + x += img->x; + while (y < 0) + y += img->y; + x = x % img->x; + y = y % img->y; + } + c.b = img->data[y * img->sl + x * (img->bpp >> 3)] & 0xFF; + c.g = img->data[y * img->sl + x * (img->bpp >> 3) + 1] & 0xFF00 >> 8; + c.r = img->data[y * img->sl + x * (img->bpp >> 3) + 2] & 0xFF0000 >> 16; + return (c); +} + +t_img *img_map_pixel(t_data *d, int (*f)(t_color)) +{ + int x; + int y; + t_color c; + t_img *img; + + img = init_img(d->mlx, d->width, d->height); + x = -1; + while (++x < d->width) + { + y = -1; + while (++y < d->height) + { + c = img_pull_pixel(x, y, d->img); + putpixel(x, y, f(c), img); + } + } + return (img); +} + +void img_recolor(t_data *d, int (*f)(t_color)) +{ + t_img *img; + + img = img_map_pixel(d, f); + mlx_clear_window(d->mlx, d->win); + mlx_put_image_to_window(d->mlx, d->win, img->img, 0, 0); + free_img(d->mlx, img); +} + +void **init_post_pro(void) +{ + void **p_p; + + p_p = (void **)ft_memalloc(sizeof(void *) * 5); + p_p[0] = &img_b_n_w; + p_p[1] = &img_sepia; + p_p[2] = &img_negative; + p_p[3] = &img_b_n_w; + p_p[4] = &img_b_n_w; + return (p_p); +} diff --git a/src/post_pro_img_anaglyph.c b/src/post_pro_img_anaglyph.c new file mode 100644 index 0000000..b3c730e --- /dev/null +++ b/src/post_pro_img_anaglyph.c @@ -0,0 +1,56 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* post_pro_img_anaglyph.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/11/23 04:57:44 by ntrahy #+# #+# */ +/* Updated: 2016/12/02 10:31:32 by ntrahy ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +t_img *img_anaglyph_fuse(t_data *d, t_img *blu, t_img *red) +{ + int x; + int y; + t_color c_red; + t_color c_blu; + t_img *fuse; + + fuse = init_img(d, d->width, d->height); + x = -1; + while (++x < d->width) + { + y = -1; + while (++y < d->height) + { + c_red = img_pull_pixel(x, y, red); + c_blu = img_pull_pixel(x, y, blu); + putpixel(x, y, + get_color((t_color){c_red.r, c_blu.g, c_blu.b}), fuse); + } + } + return (fuse); +} + +void img_anaglyph(t_data *d) +{ + t_img *save; + t_img *fuse; + + save = d->img; + d->cam.pos.x++; + create_cam(&(d->cam), d); + d->img = init_img(d, d->width, d->height); + raytracer(d); + fuse = img_anaglyph_fuse(d, d->img, save); + mlx_put_image_to_window(d->mlx, d->win, fuse->img, 0, 0); + free(d->img); + free(fuse); + d->img = save; + d->cam.pos.x--; + create_cam(&(d->cam), d); +} diff --git a/src/post_pro_recolor.c b/src/post_pro_recolor.c new file mode 100644 index 0000000..487006d --- /dev/null +++ b/src/post_pro_recolor.c @@ -0,0 +1,48 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* post_pro_recolor.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/11/23 04:57:51 by ntrahy #+# #+# */ +/* Updated: 2016/11/23 04:57:53 by ntrahy ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +int img_b_n_w(t_color c) +{ + t_color new; + unsigned int k; + + k = (c.b * 0.07 + c.g * 0.72 + c.r * 0.21); + new.b = k; + new.g = k; + new.r = k; + return (get_color(new)); +} + +int img_sepia(t_color c) +{ + t_color new; + + if ((new.r = 0.393 * c.r + 0.769 * c.g + 0.189 * c.b) > 255) + new.r = 255; + if ((new.g = 0.349 * c.r + 0.686 * c.g + 0.168 * c.b) > 255) + new.g = 255; + if ((new.b = 0.272 * c.r + 0.534 * c.g + 0.131 * c.b) > 255) + new.b = 255; + return (get_color(new)); +} + +int img_negative(t_color c) +{ + t_color new; + + new.b = 255 - c.b; + new.g = 255 - c.g; + new.r = 255 - c.r; + return (get_color(new)); +} diff --git a/src/putpixel.c b/src/putpixel.c new file mode 100644 index 0000000..8606509 --- /dev/null +++ b/src/putpixel.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* putpixel.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/10/01 16:28:34 by scebula #+# #+# */ +/* Updated: 2017/01/03 00:47:36 by ntrahy ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void putpixel(int x, int y, unsigned int color, t_img *img) +{ + unsigned char r; + unsigned char g; + unsigned char b; + unsigned char t; + + b = (color & 0xFF) >> 0; + g = (color & 0xFF00) >> 8; + r = (color & 0xFF0000) >> 16; + t = (color & 0xFF000000) >> 24; + t = 0; + if (img->endian == 0) + { + img->data[(y * img->sl) + x * (img->bpp >> 3)] = b; + img->data[(y * img->sl) + x * (img->bpp >> 3) + 1] = g; + img->data[(y * img->sl) + x * (img->bpp >> 3) + 2] = r; + img->data[(y * img->sl) + x * (img->bpp >> 3) + 3] = t; + } + else + { + img->data[y * img->sl + x * img->bpp / 8] = (color & 0xFF) >> 0; + img->data[y * img->sl + x * img->bpp / 8 + 1] = (color & 0xFF00) >> 8; + img->data[y * img->sl + x * img->bpp / 8 + 2] = + (color & 0xFF0000) >> 16; + } +} diff --git a/src/record_tools.c b/src/record_tools.c new file mode 100644 index 0000000..7b8fc26 --- /dev/null +++ b/src/record_tools.c @@ -0,0 +1,46 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* record_tools.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/10/01 19:02:28 by scebula #+# #+# */ +/* Updated: 2017/01/07 14:40:08 by gbrochar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void free_info(t_record *info) +{ + if (info) + { + free(info); + info = NULL; + } +} + +void init_info_zero(t_record *info) +{ + info->obj = NULL; + info->oldnorm = init_vector(0, 0, 0, 1); + info->n_pos = init_vector(0, 0, 0, 0); + info->refl_dir = init_vector(0, 0, 0, 0); + info->to_light_dir = init_vector(0, 0, 0, 0); + info->oldnorm = init_vector(0, 0, 0, 0); + info->normal = init_vector(0, 0, 0, 0); + info->refl_ray.ori = init_vector(0, 0, 0, 0); + info->to_light_ray.ori = init_vector(0, 0, 0, 0); + info->ray.ori = init_vector(0, 0, 0, 0); + info->refl_ray.dir = init_vector(0, 0, 0, 0); + info->to_light_ray.dir = init_vector(0, 0, 0, 0); + info->ray.dir = init_vector(0, 0, 0, 0); + info->dist_to_light = -1; + info->cosinus = -1; + info->dist = -1; + info->type = -1; + info->current_thread = NULL; + info->obj = NULL; + info->color = set_color(0, 0, 0); +} diff --git a/src/rt_calculate_ray.c b/src/rt_calculate_ray.c new file mode 100644 index 0000000..6529c3f --- /dev/null +++ b/src/rt_calculate_ray.c @@ -0,0 +1,56 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* rt_calculate_ray.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/03 15:47:59 by scebula #+# #+# */ +/* Updated: 2017/01/03 15:48:01 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +static t_vect calculate_ray_dir(t_data *d, double x, double y, + t_thread *thread) +{ + double xindent; + double yindent; + t_vect ray_dir; + t_vect left; + t_vect up; + + if (thread) + xindent = d->cam.plane_width / d->width * (thread->x + x * + (1 / d->aa_lvl)); + else + xindent = d->cam.plane_width / d->width * (x * (1 / d->aa_lvl)); + if (thread) + yindent = d->cam.plane_height / d->height * (thread->y + y * + (1 / d->aa_lvl)); + else + yindent = d->cam.plane_height / d->height * (y * (1 / d->aa_lvl)); + ray_dir = d->cam.first_pixel_dir; + left = d->cam.left; + mult_vector(&left, xindent); + up = d->cam.up; + mult_vector(&up, yindent * -1); + substract_to_vector(&ray_dir, left); + add_to_vector(&ray_dir, up); + normalize_vector(&ray_dir); + return (ray_dir); +} + +t_ray calculate_ray(t_data *d, double x, double y, + t_thread *thread) +{ + t_vect cam_ray_dir; + t_vect cam_ray_ori; + t_ray cam_ray; + + cam_ray_dir = calculate_ray_dir(d, x, y, thread); + cam_ray_ori = d->cam.pos; + cam_ray = init_ray(cam_ray_ori, cam_ray_dir); + return (cam_ray); +} diff --git a/src/rt_find_n.c b/src/rt_find_n.c new file mode 100644 index 0000000..e967f5e --- /dev/null +++ b/src/rt_find_n.c @@ -0,0 +1,100 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* rt_find_n.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/12/20 18:54:23 by scebula #+# #+# */ +/* Updated: 2017/01/07 10:55:41 by gbrochar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +t_vect find_n_pos(t_ray ray, t_record *info) +{ + mult_vector(&(ray.dir), info->dist); + add_to_vector(&(ray.ori), ray.dir); + return (ray.ori); +} + +void find_n_dist(t_research *r, t_data *d, t_thread *thread) +{ + r->dist[0] = 0; + r->dist[1] = 0; + r->dist[2] = 0; + if (r->current_obj->type != CSG) + { + apply_inverse_tf(r->current_obj, &(r->modified_ray.ori), d); + apply_inverse_tf(r->current_obj, &(r->modified_ray.dir), d); + ((void (*)(t_ray ray, t_obj *, t_thread *, double *)) + d->func->get_obj_n[r->current_obj->type])(r->modified_ray, + r->current_obj, thread, r->dist); + check_cut(r, d, thread); + } + else + get_csg_n(r, thread, d); +} + +static t_record *create_record(t_research r, t_data *d, t_thread *thread) +{ + t_record *info; + + info = (t_record *)ft_memalloc(sizeof(t_record)); + init_info_zero(info); + info->type = r.closest_obj->type; + info->obj = r.closest_obj; + info->dist = r.final_dist - ACC; + info->ray = r.final_ray; + info->n_pos = find_n_pos(r.final_ray, info); + info->normal = define_obj_normal(info, d, thread); + apply_tf(info->obj, &(info->ray.dir), d, TF_RAY); + apply_tf(info->obj, &(info->ray.ori), d, TF_RAY); + info->color = COLOR(info->obj); + define_obj_color(info); + apply_tf(info->obj, &(info->n_pos), d, TF_INTERSECTION); + if_plane_cut_an_object(d, info, thread); + if (dot_product_vector(info->ray.dir, info->normal) > 0) + negative_vector(&(info->normal)); + return (info); +} + +void init_var(t_research *r, t_ray ray) +{ + r->closest_obj = NULL; + r->current_obj = NULL; + r->dist[0] = 0; + r->dist[1] = 0; + r->dist[2] = 0; + r->final_dist = 0; + r->modified_ray = ray; +} + +t_record *find_n(t_ray ray, t_data *d, t_thread *thread) +{ + t_research r; + t_obj *tmp; + + init_var(&r, ray); + tmp = d->obj; + while (tmp) + { + r.modified_ray = ray; + r.current_obj = tmp; + find_n_dist(&r, d, thread); + if ((r.dist[2] > r.final_dist && r.final_dist == 0 && + r.dist[2] > ACC) || + (r.dist[2] < r.final_dist && r.final_dist > 0 && + r.dist[2] > ACC)) + { + r.final_dist = r.dist[2]; + r.closest_obj = r.current_obj; + r.final_ray = r.modified_ray; + } + if (tmp->next == NULL && r.final_dist > ACC) + return (create_record(r, d, thread)); + tmp = tmp->next; + } + return (NULL); +} diff --git a/src/rt_get_color_at.c b/src/rt_get_color_at.c new file mode 100644 index 0000000..94680f4 --- /dev/null +++ b/src/rt_get_color_at.c @@ -0,0 +1,51 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* rt_get_color_at.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/07 16:21:47 by ntrahy #+# #+# */ +/* Updated: 2017/01/08 12:56:06 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" +#include + +unsigned char moy(t_color color) +{ + return ((color.r + color.g + color.b) / 3); +} + +static t_color apply_ambient(t_data *d, t_color obj_color) +{ + t_color final_color; + + final_color = obj_color; + color_scale(&final_color, d->ambient); + return (final_color); +} + +t_color *get_color_at(t_data *d, t_record *info) +{ + t_color final_color; + t_light *light_list; + static int reflect[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + int thread_number; + + info->oldnorm = info->normal; + thread_number = info->current_thread->num; + final_color = apply_ambient(d, get_pixel_color(d, info, info->obj->type)); + light_list = d->light_list; + while (light_list) + { + add_diffuse_and_specular(info, d, light_list, &final_color); + light_list = light_list->next; + } + if (++reflect[thread_number] <= d->reflections) + add_refls(d, info, &final_color); + info->color = final_color; + reflect[thread_number] = 0; + return (&(info->color)); +} diff --git a/src/rt_get_pixel_color.c b/src/rt_get_pixel_color.c new file mode 100644 index 0000000..87d4c5e --- /dev/null +++ b/src/rt_get_pixel_color.c @@ -0,0 +1,112 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* rt_get_pixel_color.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/08 12:47:45 by scebula #+# #+# */ +/* Updated: 2017/01/08 12:57:33 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" +#include + +double get_solid_tex_y(double hit) +{ + double decimal; + + hit += 1; + hit /= 2; + decimal = fmod(hit, 1); + if (decimal < 0) + decimal = 1 + decimal; + return (decimal); +} + +t_color texmodifier(double pos[2], t_texture *tex, t_color c, char alt) +{ + if (tex != NULL) + c = img_pull_pixel(pos[0] * + tex->img.x, pos[1] * tex->img.y, &tex->img); + if (alt == SINX) + c = set_color(c.r * sin(pos[0] * M_PI), c.g + * sin(pos[0] * M_PI), c.b * sin(pos[0] * M_PI)); + else if (alt == SINY) + c = set_color(c.r * sin(pos[1] * M_PI), c.g + * sin(pos[1] * M_PI), c.b * sin(pos[1] * M_PI)); + else if (alt == SINXY) + c = set_color(c.r * sin(pos[1] * M_PI) * + sin(pos[0] * M_PI), c.g * sin(pos[1] * M_PI) * + sin(pos[0] * M_PI), c.b * sin(pos[1] * M_PI) * + sin(pos[0] * M_PI)); + else if (alt == QUAD) + c = ((pos[0] > 0.5 && pos[1] > 0.5) || (pos[0] < + 0.5 && pos[1] < 0.5)) ? set_color(0, 0, 0) : c; + return (c); +} + +int solid_texturemode(int type) +{ + return (type == SPHERE || type == CYLINDER || type == CONE || + type == HYPERBOLOID || type == PARABOLOID); +} + +void bumpmap_normal(double x, double y, t_record *info) +{ + t_vect result; + t_texture *tex; + double res[5]; + + if ((tex = bumpmapgetter(info->obj->type, info->obj)) == NULL) + return ; + res[0] = GET_COLOR_MOY(x * tex->img.x, y * tex->img.y + 1); + res[1] = GET_COLOR_MOY(x * tex->img.x - 1, y * tex->img.y); + res[2] = GET_COLOR_MOY(x * tex->img.x, y * tex->img.y); + res[3] = GET_COLOR_MOY(x * tex->img.x, y * tex->img.y - 1); + res[4] = GET_COLOR_MOY(x * tex->img.x + 1, y * tex->img.y); + result.y = res[2]; + result.z = res[0] - res[3]; + result.x = res[4] - res[1]; + if (result.x == 0 && result.y == 0 && result.z == 0) + return ; + info->oldnorm = info->normal; + normalize_vector(&result); + if (info->obj->type == PLANE) + info->normal = result; + else if (!(result.x == 0 && result.y == 1 && result.z == 0)) + if (solid_texturemode(info->obj->type)) + info->normal = get_bumped_vect(info->normal, result); + if (dot_product_vector(info->normal, info->oldnorm) < 0) + info->normal = info->oldnorm; +} + +t_color get_pixel_color(t_data *d, t_record *info, int type) +{ + t_vect hitpos; + t_texture *tex; + double pos[2]; + + hitpos = info->n_pos; + apply_inverse_tf(info->obj, &hitpos, d); + if (solid_texturemode(type)) + { + pos[0] = ((atan2(hitpos.x, hitpos.z) + M_PI) / (2 * M_PI)); + pos[1] = get_solid_tex_y(hitpos.y); + } + else if (type == PLANE) + { + pos[0] = get_solid_tex_y(hitpos.z); + pos[1] = get_solid_tex_y(hitpos.x); + } + else + return (info->color); + pos[0] = texoffx(type, info->obj, texscalex(type, info->obj, pos[0])); + pos[1] = texoffy(type, info->obj, texscaley(type, info->obj, pos[1])); + tex = texturegetter(info->obj->type, info->obj); + info->color = texmodifier(pos, tex, info->color, + texmodifiergetter(info->obj->type, info->obj)); + bumpmap_normal(pos[0], pos[1], info); + return (info->color); +} diff --git a/src/rt_raytracer.c b/src/rt_raytracer.c new file mode 100644 index 0000000..635ced7 --- /dev/null +++ b/src/rt_raytracer.c @@ -0,0 +1,100 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* rt_raytracer.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/03 16:05:36 by scebula #+# #+# */ +/* Updated: 2017/01/10 19:39:23 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +static void init_x_info_color(double *x, t_record **info, + t_color *color) +{ + *x = -1; + *info = NULL; + *color = set_color(0, 0, 0); +} + +static t_color calculate_pixel(t_data *d, t_thread *t) +{ + double x; + double y; + t_record *info; + t_ray cam_ray; + t_color color; + + init_x_info_color(&x, &info, &color); + while (++x < d->aa_lvl) + { + y = -1; + while (++y < d->aa_lvl) + { + cam_ray = calculate_ray(d, x, y, t); + info = find_n(cam_ray, d, t); + if (info) + { + info->current_thread = t; + get_color_at(d, info); + color_add_nolimit(&color, info->color); + free_info(info); + } + } + } + color_divide(&(color), d->dpp); + return (color); +} + +static void init_thread_values(t_thread *t) +{ + t->x = t->num * t->d->width / THREADS; + t->y = 0; + t->d->x = 0; + t->d->y = 0; +} + +static void *calculate(void *p) +{ + t_color color; + t_thread *t; + double end_x; + + t = (t_thread *)p; + end_x = (t->num + 1) * t->d->width / THREADS; + init_thread_values(t); + while (t->x < end_x) + { + while (t->y < t->d->height) + { + color = calculate_pixel(t->d, t); + putpixel(t->x, t->y, get_color(color), t->d->img); + t->y++; + t->d->y++; + } + t->y = 0; + t->d->y = 0; + t->d->x++; + t->x++; + } + pthread_exit(0); +} + +void raytracer(t_data *d) +{ + int i; + + i = -1; + while (++i < THREADS) + { + d->th[i].num = i; + d->th[i].d = (t_data *)d; + pthread_create(&d->th[i].t, NULL, calculate, &d->th[i]); + } + i = -1; + while (++i < THREADS) + pthread_join(d->th[i].t, NULL); +} diff --git a/src/rt_reflection.c b/src/rt_reflection.c new file mode 100644 index 0000000..01182e1 --- /dev/null +++ b/src/rt_reflection.c @@ -0,0 +1,64 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* reflection.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/10/01 16:35:33 by scebula #+# #+# */ +/* Updated: 2017/01/03 15:50:01 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void add_refl_color(t_color *final_color, t_color refl_color, + double refl_degree) +{ + color_scale(&refl_color, refl_degree); + color_add(final_color, refl_color); +} + +t_vect calculate_refl_dir(t_record *info) +{ + double dot_product; + t_vect ray_dir; + t_vect refl_dir; + + ray_dir = info->ray.dir; + negative_vector(&ray_dir); + dot_product = dot_product_vector(ray_dir, info->normal); + refl_dir = info->normal; + mult_vector(&refl_dir, dot_product * 2); + add_to_vector(&refl_dir, info->ray.dir); + normalize_vector(&refl_dir); + return (refl_dir); +} + +void calculate_refl_ray(t_record *info) +{ + info->refl_dir = calculate_refl_dir(info); + info->refl_ray = init_ray(info->n_pos, info->refl_dir); +} + +void add_refls(t_data *d, t_record *info, t_color *final_color) +{ + t_record *refl_info; + t_color *color; + + refl_info = NULL; + if (*info->obj->reflectionx <= 1 && *info->obj->reflectionx > 0) + { + calculate_refl_ray(info); + refl_info = find_n(info->refl_ray, d, info->current_thread); + if (refl_info) + { + refl_info->current_thread = info->current_thread; + color = get_color_at(d, refl_info); + refl_info->color = *color; + add_refl_color(final_color, refl_info->color, + *info->obj->reflectionx); + } + } + free_info(refl_info); +} diff --git a/src/rt_shadow.c b/src/rt_shadow.c new file mode 100644 index 0000000..6b67120 --- /dev/null +++ b/src/rt_shadow.c @@ -0,0 +1,71 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* shadow.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/10/01 16:49:56 by scebula #+# #+# */ +/* Updated: 2017/01/03 15:58:22 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void color_add_diffuse(t_color *final_color, t_record *info, + t_color light_color) +{ + t_color obj_color; + + obj_color = info->color; + color_multiply(&obj_color, light_color); + color_scale(&obj_color, info->cosinus * DIFFUSE); + color_add(final_color, obj_color); +} + +void calculate_diffuse_and_specular(t_record *info, t_data *d, + t_color *final_color, t_light *light_list) +{ + t_record *shadow_info; + char shadow; + + shadow_info = NULL; + shadow = NOT_FOUND; + info->to_light_ray = init_ray(info->n_pos, info->to_light_dir); + shadow_info = find_n(info->to_light_ray, d, info->current_thread); + if (shadow_info) + if (shadow_info->dist <= info->dist_to_light) + shadow = FOUND; + if (shadow == NOT_FOUND) + { + color_add_diffuse(final_color, info, light_list->color); + specular_color(info, final_color, light_list); + } + free_info(shadow_info); +} + +t_vect calculate_to_light_dir(t_vect light_pos, + t_vect n_pos) +{ + substract_to_vector(&light_pos, n_pos); + light_pos.w = 0; + return (light_pos); +} + +void add_diffuse_and_specular(t_record *info, t_data *d, + t_light *light_list, t_color *final_color) +{ + t_record *shadow_info; + + shadow_info = NULL; + info->to_light_dir = calculate_to_light_dir(light_list->pos, + info->n_pos); + info->dist_to_light = vector_magnitude(info->to_light_dir); + normalize_vector(&(info->to_light_dir)); + if (dot_product_vector(info->oldnorm, info->to_light_dir) < 0) + return ; + info->cosinus = dot_product_vector(info->normal, info->to_light_dir); + if (info->cosinus > 0) + calculate_diffuse_and_specular(info, d, final_color, light_list); + free_info(shadow_info); +} diff --git a/src/specular.c b/src/specular.c new file mode 100644 index 0000000..a1816d3 --- /dev/null +++ b/src/specular.c @@ -0,0 +1,40 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* specular.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/10/01 16:50:16 by scebula #+# #+# */ +/* Updated: 2016/10/20 17:41:34 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void add_specular_color(t_color *final_color, t_color light_color, + double specular, double degree) +{ + specular = pow(specular, 10); + color_scale(&light_color, specular * degree); + color_add(final_color, light_color); +} + +void calculate_specular_color(t_color *final_color, t_color light_color, + t_record *info) +{ + double specular; + + calculate_refl_ray(info); + specular = dot_product_vector(info->refl_dir, info->to_light_dir); + if (specular > 0) + add_specular_color(final_color, light_color, specular, + *info->obj->shinex); +} + +void specular_color(t_record *info, t_color *final_color, + t_light *light_list) +{ + if (*info->obj->shinex > 0 && *info->obj->shinex <= 1) + calculate_specular_color(final_color, light_list->color, info); +} diff --git a/src/texture_getter.c b/src/texture_getter.c new file mode 100644 index 0000000..0f413b1 --- /dev/null +++ b/src/texture_getter.c @@ -0,0 +1,64 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* texture_getter.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/03 16:42:08 by scebula #+# #+# */ +/* Updated: 2017/01/08 12:59:10 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +t_texture *texturegetter(char type, t_obj *obj) +{ + if (type == CONE) + return (TO_CONE->texture); + else if (type == CYLINDER) + return (TO_CYLINDER->texture); + else if (type == SPHERE) + return (TO_SPHERE->texture); + else if (type == PLANE) + return (TO_PLANE->texture); + else if (type == PARABOLOID) + return (TO_PARABOLOID->texture); + else if (type == HYPERBOLOID) + return (TO_HYPERBOLOID->texture); + return (NULL); +} + +t_texture *bumpmapgetter(char type, t_obj *obj) +{ + if (type == CONE) + return (TO_CONE->bumpmap); + else if (type == CYLINDER) + return (TO_CYLINDER->bumpmap); + else if (type == SPHERE) + return (TO_SPHERE->bumpmap); + else if (type == PLANE) + return (TO_PLANE->bumpmap); + else if (type == PARABOLOID) + return (TO_PARABOLOID->bumpmap); + else if (type == HYPERBOLOID) + return (TO_HYPERBOLOID->bumpmap); + return (NULL); +} + +char texmodifiergetter(char type, t_obj *obj) +{ + if (type == CONE) + return (TO_CONE->texmodifier); + else if (type == CYLINDER) + return (TO_CYLINDER->texmodifier); + else if (type == SPHERE) + return (TO_SPHERE->texmodifier); + else if (type == PLANE) + return (TO_PLANE->texmodifier); + else if (type == PARABOLOID) + return (TO_PARABOLOID->texmodifier); + else if (type == HYPERBOLOID) + return (TO_HYPERBOLOID->texmodifier); + return (0); +} diff --git a/src/texture_manager.c b/src/texture_manager.c new file mode 100644 index 0000000..4921ec3 --- /dev/null +++ b/src/texture_manager.c @@ -0,0 +1,44 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* texture_manager.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 23:04:46 by ntrahy #+# #+# */ +/* Updated: 2017/01/09 20:33:50 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +int ft_load_image(t_data *d, t_texture *tex, char *path) +{ + tex->img.endian = 0; + tex->img.img = + mlx_xpm_file_to_image(d->mlx, path, &tex->img.x, &tex->img.y); + if (!tex->img.img) + ft_malloc_error(); + tex->img.data = mlx_get_data_addr(tex->img.img, &tex->img.bpp, + &tex->img.sl, &tex->img.endian); + tex->path = ft_strdup(path); + return (0); +} + +t_texture *get_texture_data(t_data *d, char *path) +{ + t_texture *lst; + + lst = d->texturelist; + while (lst != NULL) + { + if (ft_strcmp(lst->path, path) == 0) + return (lst); + lst = lst->next; + } + lst = (t_texture *)ft_memalloc(sizeof(t_texture)); + ft_load_image(d, lst, path); + lst->next = d->texturelist; + d->texturelist = lst; + return (lst); +} diff --git a/src/texture_modifiers.c b/src/texture_modifiers.c new file mode 100644 index 0000000..eb728b9 --- /dev/null +++ b/src/texture_modifiers.c @@ -0,0 +1,81 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* texture_modifiers.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/08 12:58:53 by scebula #+# #+# */ +/* Updated: 2017/01/08 12:59:11 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +double texscalex(char type, t_obj *obj, double in) +{ + if (type == CONE) + return (in * TO_CONE->scale_x); + else if (type == CYLINDER) + return (in * TO_CYLINDER->scale_x); + else if (type == SPHERE) + return (in * TO_SPHERE->scale_x); + else if (type == PLANE) + return (in * TO_PLANE->scale_x); + else if (type == PARABOLOID) + return (in * TO_PARABOLOID->scale_x); + else if (type == HYPERBOLOID) + return (in * TO_HYPERBOLOID->scale_x); + return (1); +} + +double texscaley(char type, t_obj *obj, double in) +{ + if (type == CONE) + return (in * TO_CONE->scale_y); + else if (type == CYLINDER) + return (in * TO_CYLINDER->scale_y); + else if (type == SPHERE) + return (in * TO_SPHERE->scale_y); + else if (type == PLANE) + return (in * TO_PLANE->scale_y); + else if (type == PARABOLOID) + return (in * TO_PARABOLOID->scale_y); + else if (type == HYPERBOLOID) + return (in * TO_HYPERBOLOID->scale_y); + return (1); +} + +double texoffx(char type, t_obj *obj, double in) +{ + if (type == CONE) + return (in + TO_CONE->off_x); + else if (type == CYLINDER) + return (in + TO_CYLINDER->off_x); + else if (type == SPHERE) + return (in + TO_SPHERE->off_x); + else if (type == PLANE) + return (in + TO_PLANE->off_x); + else if (type == PARABOLOID) + return (in + TO_PARABOLOID->off_x); + else if (type == HYPERBOLOID) + return (in + TO_HYPERBOLOID->off_x); + return (0); +} + +double texoffy(char type, t_obj *obj, double in) +{ + if (type == CONE) + return (in + TO_CONE->off_y); + else if (type == CYLINDER) + return (in + TO_CYLINDER->off_y); + else if (type == SPHERE) + return (in + TO_SPHERE->off_y); + else if (type == PLANE) + return (in + TO_PLANE->off_y); + else if (type == PARABOLOID) + return (in + TO_PARABOLOID->off_y); + else if (type == HYPERBOLOID) + return (in + TO_HYPERBOLOID->off_y); + return (0); +} diff --git a/src/tf_add.c b/src/tf_add.c new file mode 100644 index 0000000..cd96fab --- /dev/null +++ b/src/tf_add.c @@ -0,0 +1,73 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* tf_add.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/10/01 16:54:42 by scebula #+# #+# */ +/* Updated: 2017/01/05 14:50:26 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +t_tf_list *add_zrot_tf(double deg) +{ + t_tf_list *tf_list; + + tf_list = (t_tf_list *)ft_memalloc(sizeof(t_tf_list)); + tf_list->tf = init_zrotation_matrix(deg); + tf_list->type = ROTATION_Z; + tf_list->next = NULL; + tf_list->previous = NULL; + return (tf_list); +} + +t_tf_list *add_yrot_tf(double deg) +{ + t_tf_list *tf_list; + + tf_list = (t_tf_list *)ft_memalloc(sizeof(t_tf_list)); + tf_list->tf = init_yrotation_matrix(deg); + tf_list->type = ROTATION_Y; + tf_list->next = NULL; + tf_list->previous = NULL; + return (tf_list); +} + +t_tf_list *add_xrot_tf(double deg) +{ + t_tf_list *tf_list; + + tf_list = (t_tf_list *)ft_memalloc(sizeof(t_tf_list)); + tf_list->tf = init_xrotation_matrix(deg); + tf_list->type = ROTATION_X; + tf_list->next = NULL; + tf_list->previous = NULL; + return (tf_list); +} + +t_tf_list *add_trans_tf(t_vect t) +{ + t_tf_list *tf_list; + + tf_list = (t_tf_list *)ft_memalloc(sizeof(t_tf_list)); + tf_list->tf = init_translation_matrix(t.x, t.y, t.z); + tf_list->type = TRANSLATION; + tf_list->next = NULL; + tf_list->previous = NULL; + return (tf_list); +} + +t_tf_list *add_scale_tf(double x, double y, double z) +{ + t_tf_list *tf_list; + + tf_list = (t_tf_list *)ft_memalloc(sizeof(t_tf_list)); + tf_list->tf = init_scale_matrix(x, y, z); + tf_list->type = SCALE; + tf_list->next = NULL; + tf_list->previous = NULL; + return (tf_list); +} diff --git a/src/tf_apply.c b/src/tf_apply.c new file mode 100644 index 0000000..0bbca3c --- /dev/null +++ b/src/tf_apply.c @@ -0,0 +1,61 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* tf_apply.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/10/01 16:55:02 by scebula #+# #+# */ +/* Updated: 2016/12/20 15:37:51 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void apply_tf(t_obj *obj, t_vect *v, t_data *d, int type) +{ + t_tf_list *tf_list; + t_matrix inverse; + + tf_list = NULL; + if (d->func->get_obj_tf_list[obj->type] == NULL) + return ; + tf_list = + ((t_tf_list *(*)(t_obj *))d->func->get_obj_tf_list[obj->type])(obj); + while (tf_list) + { + if (tf_list->type == SCALE && type == TF_NORMAL) + { + inverse = get_inverse_matrix(tf_list->tf); + apply_matrix(inverse, v); + normalize_vector(v); + } + else if (!((tf_list->type == TRANSLATION) && v->w == 0)) + apply_matrix(tf_list->tf, v); + tf_list = tf_list->next; + } +} + +void apply_inverse_tf(t_obj *obj, t_vect *v, t_data *d) +{ + t_tf_list *tf_list; + t_matrix inverse; + + tf_list = NULL; + if (obj->type == 10) + return ; + tf_list = + ((t_tf_list *(*)(t_obj *))d->func->get_obj_tf_list[obj->type])(obj); + if (tf_list) + while (tf_list->next) + tf_list = tf_list->next; + else + return ; + while (tf_list) + { + inverse = get_inverse_matrix(tf_list->tf); + if (!(tf_list->type == TRANSLATION && v->w == 0)) + apply_matrix(inverse, v); + tf_list = tf_list->previous; + } +} diff --git a/src/tf_free.c b/src/tf_free.c new file mode 100644 index 0000000..896a880 --- /dev/null +++ b/src/tf_free.c @@ -0,0 +1,109 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* tf_free.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/10/01 16:55:43 by scebula #+# #+# */ +/* Updated: 2017/01/09 20:48:03 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +t_tf_list *free_tf_list(t_tf_list **begin_tf_list) +{ + t_tf_list *tmp; + t_tf_list *tmp2; + + tmp = *begin_tf_list; + tmp2 = NULL; + while (tmp) + { + tmp2 = tmp->next; + free(tmp); + tmp = tmp2; + } + *begin_tf_list = NULL; + return (NULL); +} + +void free_texture(void *mlx, t_texture *b_list) +{ + t_texture *tmp_0; + t_texture *tmp_1; + + tmp_0 = b_list; + if (tmp_0) + while (tmp_0) + { + tmp_1 = tmp_0->next; + if (tmp_0->img.img) + mlx_destroy_image(mlx, tmp_0->img.img); + free(tmp_0->path); + free(tmp_0); + tmp_0 = tmp_1; + } +} + +t_obj *free_cut(t_obj **begin_cut) +{ + t_obj *tmp; + t_obj *tmp2; + + tmp = *begin_cut; + tmp2 = NULL; + while (tmp) + { + tmp2 = tmp->next; + free_obj(&tmp->cut); + free(tmp); + tmp = tmp2; + } + *begin_cut = NULL; + return (NULL); +} + +t_cube *free_cube(t_cube *cube) +{ + int i; + + i = 0; + if (cube) + { + free_tf_list(&(cube->tf_list)); + while (i < 12) + { + if (cube->triangle[i]) + free_obj(&cube->triangle[i]); + i++; + } + free_cut(&cube->cut); + free(cube); + cube = NULL; + } + return (NULL); +} + +void select_free_obj(t_obj *tmp) +{ + if (tmp->type == SPHERE && tmp->solid) + free_sphere(tmp->solid->sphere); + else if (tmp->type == PLANE && tmp->solid) + free_plane(tmp->solid->plane); + else if (tmp->type == CYLINDER && tmp->solid) + free_cylinder(tmp->solid->cylinder); + else if (tmp->type == CONE && tmp->solid) + free_cone(tmp->solid->cone); + else if (tmp->type == CSG && tmp->solid) + free_csg(tmp->solid->csg); + else if (tmp->type == HYPERBOLOID && tmp->solid) + free_hyperboloid(tmp->solid->hyperboloid); + else if (tmp->type == PARABOLOID && tmp->solid) + free_paraboloid(tmp->solid->paraboloid); + else if (tmp->type == PRISM && tmp->solid) + free_prism(tmp->solid->prism); + else if (tmp->type == CUBE && tmp->solid) + free_cube(tmp->solid->cube); +} diff --git a/src/tf_push.c b/src/tf_push.c new file mode 100644 index 0000000..5004abf --- /dev/null +++ b/src/tf_push.c @@ -0,0 +1,99 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* tf_push.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: scebula +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/10/01 16:55:52 by scebula #+# #+# */ +/* Updated: 2016/10/20 17:49:38 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void push_zrot_tf(t_tf_list **begin_tf_list, double deg) +{ + t_tf_list *tmp; + + tmp = *begin_tf_list; + if (tmp) + { + while (tmp->next) + tmp = tmp->next; + tmp->next = add_zrot_tf(deg); + tmp->next->previous = tmp; + } + else + *begin_tf_list = add_zrot_tf(deg); +} + +void push_yrot_tf(t_tf_list **begin_tf_list, double deg) +{ + t_tf_list *tmp; + + tmp = *begin_tf_list; + if (tmp) + { + while (tmp->next) + tmp = tmp->next; + tmp->next = add_yrot_tf(deg); + tmp->next->previous = tmp; + } + else + *begin_tf_list = add_yrot_tf(deg); +} + +void push_xrot_tf(t_tf_list **begin_tf_list, double deg) +{ + t_tf_list *tmp; + + tmp = *begin_tf_list; + if (tmp) + { + while (tmp->next) + tmp = tmp->next; + tmp->next = add_xrot_tf(deg); + tmp->next->previous = tmp; + } + else + *begin_tf_list = add_xrot_tf(deg); +} + +void push_trans_tf(t_tf_list **begin_tf_list, double x, double y, + double z) +{ + t_tf_list *tmp; + t_vect t; + + t = init_vector(x, y, z, 0); + tmp = *begin_tf_list; + if (tmp) + { + while (tmp->next) + tmp = tmp->next; + tmp->next = add_trans_tf(t); + tmp->next->previous = tmp; + } + else + *begin_tf_list = add_trans_tf(t); +} + +void push_scale_tf(t_tf_list **begin_tf_list, double x, double y, + double z) +{ + t_tf_list *tmp; + t_vect t; + + t = init_vector(x, y, z, 0); + tmp = *begin_tf_list; + if (tmp) + { + while (tmp->next) + tmp = tmp->next; + tmp->next = add_scale_tf(x, y, z); + tmp->next->previous = tmp; + } + else + *begin_tf_list = add_scale_tf(x, y, z); +} diff --git a/src/tools.c b/src/tools.c new file mode 100644 index 0000000..3408898 --- /dev/null +++ b/src/tools.c @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* tools.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ntrahy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/02 23:04:09 by ntrahy #+# #+# */ +/* Updated: 2017/01/03 16:44:38 by scebula ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "rt.h" + +void swap_double(double *a, double *b) +{ + double tmp; + + tmp = *a; + *a = *b; + *b = tmp; +} diff --git a/xpm/cmd.xpm b/xpm/cmd.xpm new file mode 100644 index 0000000..32a6ebe --- /dev/null +++ b/xpm/cmd.xpm @@ -0,0 +1,299 @@ +/* XPM */ +static char *_484132481822[] = { +/* columns rows colors chars-per-pixel */ +"1000 200 93 2 ", +" c #000000", +". c #050608", +"X c #0C0C0C", +"o c #0E100F", +"O c #0F0F11", +"+ c #0F1110", +"@ c #141414", +"# c #161817", +"$ c #161618", +"% c #171919", +"& c #1B1B1B", +"* c #201E1F", +"= c #1E201F", +"- c #21211F", +"; c #1E1F21", +": c #211F20", +"> c #1F2121", +", c #242424", +"< c #272729", +"1 c #27282A", +"2 c #2C2C2C", +"3 c #2E302F", +"4 c #2E2E30", +"5 c #2F3130", +"6 c #333333", +"7 c #363739", +"8 c #37393B", +"9 c #393A3B", +"0 c #3E403F", +"q c #3E3F41", +"w c #3F4141", +"e c #424343", +"r c #464749", +"t c #474949", +"y c #4C4C4C", +"u c #4E504F", +"i c #4F5052", +"p c #555555", +"a c #565857", +"s c #565759", +"d c #57585A", +"f c #5A5A5A", +"g c #5E5E60", +"h c #5F6062", +"j c #646464", +"k c #666867", +"l c #67686A", +"z c #6B6C6C", +"x c #656668", +"c c #6E706F", +"v c #6E6F71", +"b c #747474", +"n c #767779", +"m c #777879", +"M c #7A7A7A", +"N c #7E807F", +"B c #7E7F81", +"V c #7F8082", +"C c #838383", +"Z c #868887", +"A c #868789", +"S c #878988", +"D c #8B8C8C", +"F c #8D8E90", +"G c #8F9092", +"H c #949595", +"J c #979899", +"K c #9C9C9C", +"L c #9E9FA1", +"P c #A4A4A4", +"I c #A6A8A7", +"U c #A6A7A9", +"Y c #A7A8A9", +"T c #ABABAC", +"R c #ADB0AF", +"E c #AEAFB1", +"W c #AFB3B4", +"Q c #B2B3B3", +"! c #BBBBBB", +"~ c #BEC0BF", +"^ c #BEBFC1", +"/ c #BFC0C2", +"( c #C4C4C4", +") c #CBCBCC", +"_ c #D3D3D3", +"` c #D6D8D7", +"' c #D6D7DA", +"] c #D5D8DB", +"[ c #DBDBDB", +"{ c #E3E3E3", +"} c #EBEBEB", +"| c #F3F3F3", +" . c #FFFFFF", +/* pixels */ +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" .Q b b M b b b b b M M b b b b b b b b b b b b b b b b b b m b b b b b b b M b b Q .Q b b M b b b b b b b b b M M M M M M b b b b b b b b b b b b b b b b b b m b b Q .Q b b M b b b b b b b b M M b b M M b b b b b b b b b b b b b b b b b b b M b b Q .Q b b M b b b b b M M M b M b b b b b b b b b b b b b b b b b b b b b b b M b b P . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" .j f .j j .g g .j e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" .l z .z . l .z l .z u . . . . . . . . . ", +" .b . . X . X . . * 9 6 * X . . X . . . . . . . X . . . X . . . . X . . X . X X . b .b . . + . . . . X . 9 p g j j p 9 @ X . . . X . X . . . . . X . X X . . b .b . . + X . . . X X X * 9 6 o . 6 y * . . X X . . . X . . . . . . . . X . + . . b .b . . X X . . X @ e M C u % X . . . . . X . . . . . . . . . X . . . X X . f . . . ", +" .b . 9 b b 9 . b .b X + e M P Q ! ! I N y & . . c .b . u P k X . M I 2 . b .b . @ y H [ { T p X . p . . ", +" .b X . e Z S e . . b .b . . , I _ I M j j b Z D E E y . b .b . . b } k & K ! 4 X z .b X . b ) T P ~ ` ! g * . X p . . ", +" .c X w C C w . c .b . . 2 S _ ! z f g p 6 6 c ! _ K e . b .b . . X X G .p . e P K - . . b .b . . . @ Q { j e Z I T C 4 . . p . . ", +" .b . . w C C w . . b .b . @ K ` z % 4 M ! T p - j k p Q I @ X b .b . * 9 u E [ k 6 N T C 6 . . b .b . . 0 T P % * M u 4 u 2 . p . . ", +" .b . e C Z w . b .b X % p I D @ , H E K H H L T u X C ! 0 @ . b .b . p T ! _ { Q K ) [ ! c , . b .b X . , Q ) 7 < f X % @ . f . . ", +" .c . w C C e . z .b X 7 P M @ o D | T 0 9 L .{ g 9 D z , X c .b . . j ( [ [ ) E ! } } Q M 4 X z .b . . . K { D M C 7 X . p . . . ", +" .b X . 9 M M 9 . . c .c X t _ j u I P t . X g ! ! p * k b 9 . z .b . & r K ! S 4 f [ T 9 , + . c .b . 9 b P ` } Q j * . p . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" .b . 2 j j 6 . . b .b . X f Q w X P E w . . 7 M S r . o p V y . . b .b . X N I p 6 [ D . b .b . + g ! { _ K z , X f . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" .b . , y u , . c .b , j M @ * _ ! & y D N 6 . , z M 0 . b .b . o f ! ! k , b | E , # @ . c .b . . 7 M b H ) j . . p . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" .b . 2 p p 2 . b .b . 6 z k . 2 | Q . g ~ S @ y H f & . b .b . . p ~ | { Q K ) .{ H l 6 . b .b . X , 9 , , k % f .D . . . f . . . . . . . . . . . . . . . . . . . . . . . . . . . .Q b b M b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b M b b I . . . . . . . .Q b b M b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b M b b P . . . . . . . . . . . . . . . . . . . . ", +" .b . * 0 9 & . c .b , j C @ * { ! X @ L { k . @ D P , X b .c . . f ) .[ P E ` [ ( K b 6 . c .b X X r H N X 2 c X e | H . . p . . . . . . . . . . . .k e . . . . . .k e .. . . . . . . . 6 C I Q R Q Q Q Q Q Q Q Q Q Q R Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q W Q W Q Q Q Y M 1 ", +" .z . . b .c . . g K 2 @ Q ( t X c | { < N ! N + . c .b . * M ` G * u K D p , % X . b .c X . e ) ) 2 % k y M _ z . X p . .c p . .b p . j R H f 0 9 9 9 9 9 8 9 8 8 9 8 9 9 8 9 9 9 8 9 8 8 8 7 8 8 q 9 7 7 9 7 9 7 q x P E f ", +" .b . & 6 9 & X c .b . f ) p . p Q ~ D b H } | H C T b < @ X . b .b . % c ) j . t P z % . b .b . , K _ P H Q ! T Z 9 . p . . . . . . . . . .y . . . . . . . . .y . . . . . . . . .y . . . . . . . . .y , j Q . .J f @ . . . . . . . . . . . y Q .Q y .M . . + . . . X . . . . . . X . . . . . . . X . . . . . . . X . . . . . . X X . . g . .M X . + . . X . . . . . . X . . . . X . . . . . . X . . . . . . . X . . . . + . . j . 6 R m - @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ O O @ @ @ @ @ @ @ @ $ M Q 6 ", +" .b . . e C C e . . b .b X t ) D @ * b { .~ j C [ | _ Z 2 @ 2 * . c .b X . . 9 D I e c E g & X c .b . 6 D [ . .[ F 9 X . f . . . . . . . . . .y . . . . . . . . .y . . . . . . . . .y . . . . . . . . .y + k . . . . . . . .y . . . . . . . . . . . b . . . . .b .M . . f . .b . . f . H C # @ o o X X X X X X X X . X X X X X X X X X X X . X X X X X O X X X X X O O @ @ & D S ", +" .b . & 9 9 & . b .b X * M Q H 4 X 9 p e @ @ 9 y 6 4 c H f % . z .b . & 6 9 @ 4 e * X . b .c . . 2 p H ~ b 6 . . p . . . . . . . . . .y . . . . . . . . .y . . . . . . . . .y . . . . . . . . .p X J . . . . . . . . . ., . . . . . . . . . . . y . . . . . . .y .b . . . . . . . X f . .b . . . . . . . . . . . f . & W 8 @ o . . o @ e R % ", +" .b . . b .b . - D ) G e % X X . X * f Q ! i . X b .b . . b .b . % y X . f . . . .e , < , , , @ . . .e , , , , < @ . . .e , < , , , # . . .e , , , , , @ f . . .Q e , , e . .9 < , , e . . ., , , , Q . .C , b . .Q .b . . . f . .M . . f . t W % @ . . . . . . . . . . . . . . . . . . @ - Q 8 ", +" .b . . b .b . < M ) { ! N k j p k K [ [ H 0 X . b .b . . b .b . . . p . . . ., . . ., . . ., . . .< , . . .k X X 5 , . . . . . ., & C C C .m . . f . .b . . f . d W @ @ . . . . . . . . . . . . . . . . . . . . . . . . . . . . @ & Q t ", +" .b . . . z .b . - b P P I K G D K T Q F 0 . b .b . . . . z .b . . . . p . . . .< . . ., . . .< . . ., k . .Q O , . . . . . .9 .b . 2 0 , X % 0 p 0 . 7 p & . f . .b . . , f z z z z z c g 7 X . f . d W % @ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . @ & Q t ", +" .b . . b .b . , p b z z k t @ . b .c . . b .b . . p . . . ., . . ., . . ., . . ., Q . .e , . . . k . . .e X .M p C g , 0 P _ D @ . X M E 6 . X f . .b . . f ) ` Q ! ! ! ~ ! H e . . f . g W # + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . @ & W t ", +" .b . . . b .b . . . % * * * * + . c .b . . . . . . b .b . . . . f . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ., , . . . O J . . . .f + .b y Z C 0 f } .P 2 X 6 H P 4 . . f . .M . . M .Q f k M c c K _ P t X X f . f W # @ X X . . . . . . . . X . . . . . . . . . . . X . . . . . . . X . . X . . . . X @ & R t ", +" .b . X b .b . . . X b .b . . b .b . . p . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ., , . . . X b . . . .J X .M , z I k @ N | { H p & % f H M , . f . .M . X Z .M X % , * * e H ! D , . f . a W # @ . X . . . X X X . X . X X . X . . X . X . . X . . . . . X . X . . X X . X . X @ & Q t ", +" .b . . z .b . . c .b X X c .c X X f . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Q . .e , . . . @ k . . .k .b . p ( C @ 0 L _ K b S y . , N G f @ . f . .b X . Z .k X . . 6 K Q 9 . f . f W # + X . X . X . X . X . X . X X . X X . X . X X . X X X X X . X . X . X . X . X X O & Q t ", +" .b . . @ 4 6 @ . c .b . + 0 k b f 6 X . . b .b . . 4 j M j 7 . . z .b . 2 9 & . X p . . . .e , < < , . . .e < , , , . . .e , , < , . . .e , , , < j . .Q , . . . 6 . . . .b X 0 [ L * g K H y j Q c . . 9 T D , . . f . .M . X S .y . u E Q 9 . f . f Q @ @ X X X X X . X X X X X . X . X X X X X X . X X X X X X X X X X X X X X X X X X O # Q y ", +" .b . @ f Z k * . b .b . @ p G ! ~ T C 0 X . b .b . X t S Q ! ! H e . . . b .b . + M K w . . p . . . ., . . .< . . ., . . ., , . . .k X 6 , . . . C C C & , . . . .M . 4 ( P + , S K p * f _ S . y _ D . . f . .b . . C .C 4 6 6 2 4 j P T b & X f . f Q @ @ X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X @ = Q y ", +" .b . p ( ) c % . . c .b X y ( ! b j D Q K y . . b .b X 6 ~ _ N f H _ P w . . b .b . + p ` [ p . . f . . . .e , , , , , @ . . ., . . ., . . .e , , < , , % k . . .J 9 , , 9 Q .9 , . . . J . .C , C . .Q .b X - D H 9 4 ~ Y * y [ K . p _ N . . f . .b . X c .| { } } { ` [ ! k & . . f . f Q @ @ X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X @ & Q t ", +" .b X X 6 z ! } ) z % . b .b . * Z [ D * O 9 N _ L o . . z .b . X f ` Q 2 . 6 D ~ D * . b .b X . 0 ( ._ p X . p . . . . . . . . . .y . . ., . . .< . . . . . . . . .y X J . . . . . . . . . ., < . . . e . . . . . . .y .M X @ g C j X e { Y 9 ! P 3 & f Q j . . f . .M X . b .` Q ! ( } .{ z & . f . f Q @ @ X X X X X X X X X @ X X X X X o X X X X X X X X X X X X X X X X X X X X @ X X @ & Q t ", +" .b . * N ) [ ! H c * . c .c . e Z F 9 . * ` ` % . z .b . & f M y X 9 L T 2 . b .b . @ C | | I u @ . p . . . . . . . . . .y . . ., . . ., . . . . . . . . .y @ b . . . . . . . .f , . . . k . . . . .b .b . X e N C 6 f ` G 2 D K c u z S r X f . .b . . S .k , z ( Y - . f . f E @ @ @ X X X X X X @ X @ X X X o + X X + X @ + X + O X X @ X X @ X X X X @ X X @ X @ & W t ", +" .b . , c c g b D c , . . b .b - 6 4 X X ) [ % . X b .b . X , , X X 0 M K c & . b .z . @ D E H ! U u @ . p . . . . . . . . . .y . . ., . . ., . . . . . . . . .y , j . . .Q k @ , . . . y Q .Q y .M . % b ! b j T z * g H G M b c 5 . f . .M . X D .f & C I j * . . f . f Q @ @ X X @ @ O O @ X X @ X @ @ X O O @ X + j P + + O @ X @ X X @ X @ @ @ X X O X @ @ & Q t ", +" .b . @ 4 p G c * . b .b X @ f ( K X . . b .b . * y P { P 4 . z .b . X u { H , C Q p O . f . .b . . k _ E M N 0 X 6 C ( Q N t & . f . .b X . Z .z . . . 0 K ) k . f . f Q @ @ @ X @ X X @ X @ @ X X @ @ X + + O O & ) ` i O O X @ @ X @ X X @ X @ X @ @ X @ @ & Q t ", +" .b X . . X f D c , . c .b . . u ( P e . . b .z . . 6 G ` [ J 9 . X b .b . . e K ~ u X C ! f @ . . p . .M . . u ) [ P f * . b | | S @ . . f . .M . . Z | j X . f [ P * . f . f Q @ @ @ @ X @ @ @ X @ X @ @ X @ @ @ O @ O C _ ` / O @ @ X @ @ X @ @ @ X @ @ X @ @ X @ & Q t ", +" .b . % j D c - . . b .c . . . y T ! f . . b .b X , j N z K K < . b .c . # C T y M E 0 . f . .M . . 7 I ._ 9 . X k | .F . X f . .b . . H .b X . , D ) K < . . f . f W @ @ @ @ @ @ o @ @ @ @ O + + @ + @ + @ 7 ' ] ] ' n O @ @ @ @ @ X @ @ @ @ @ @ @ + @ @ * R y ", +" .b . + g D c , . c .b . . 9 ! ~ p + . c .b . . K } f . b .b X % j ) ! 2 . @ H ! f @ . p . .b . * b [ ! % . r I ! c X . f . .M . . M | j . , P _ e . f . d W @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ U ' ' ] ' ) : @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ * R y ", +" .b . + g D c : . b .b X . . b ) ~ z * . X c .c . % 7 e - c ) c @ . b .b X 4 Q . .) ) ) { | [ Z , X p . .M . . * 0 6 @ 2 6 * . . f . .b X . , e & 2 r % X f . f W % @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ p ` ` ` ' ] ' F @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ & Q t ", +" .z . + g D c * . c .b . @ u T E y . b .b . * k I k + C ( j % . z .b X < G ~ ) { { { } | } F 2 . . f . .b X . f . .b . . f . d W @ @ # @ # @ @ @ @ @ @ @ * + @ + * @ g M b M n n n n @ @ @ @ # @ @ @ @ @ @ @ @ @ @ @ & R t ", +" .b . + g D z , . b .c . g ( Z @ . . b .b . . g { Q @ 0 ) { 0 . b .b . . @ % & * & , H ! k * . . p . .m . . f . .b . . f . f W $ @ @ & @ @ @ % % # * @ * @ * * @ @ @ * @ @ % @ % # @ @ @ @ & @ # & @ & @ & @ % % o % Q t ", +" .b X @ z K M , . c .b . y ) .[ C S H K H b X . b .b . 6 T ) P H K Y ! S % . b .b . F / e . p . .m . . . . . . f . .M . . . . . f . d W @ @ # @ * @ & % % % @ # @ # @ @ @ * @ * # & % % & % & & & & # & & @ & @ & @ & % @ @ & Q y ", +" .c . + f C k & X b .b X b ) } | . .| . .! + . . b .b . 9 F [ .} ! g @ . b .b X . . . X C T u @ . f . .b . . f . .M . . f . f W @ @ @ * @ @ % % % % * @ # # @ * # * & @ * % % % & % & @ @ & @ & & @ @ & % & % & % @ & Q t ", +" .b . % , & . . c .b . , 9 0 e u u y u u 0 . z .b . . , e i y 9 @ X c .c . . , 2 @ . p . .m . . f . .b X . f . f W @ @ & & * * % * & & # * * @ * # * @ @ * @ % % * % & & & & & & & & & * @ * @ * % % @ & Q t ", +" .b . . b .c . . . b .b . . b .b . . p . .b . X f . .b . . f . f W $ @ & & & & & & & & * # * # & & & & & & & & & & & & & & & & & & & & & & & & & & & @ & Q y ", +" .b . . b .b X . b .z . . c .b X . p . .M . . f . .m . . f . f W $ + & & & & & & & & # * * * & & & & & & & & & & & & * & & & & & & & & & & & & & & @ # Q t ", +" .b . . X . . . . . . . X . X . . . . . . . . . . X . . . . . . . . . . . . + . . b .b . . o . . . X X X X X . X X . . X . . . . . . . . . . . X . . . X . . . X . . b .b . . + . . . . . . X X X X X X X . . . . . X . X . . . . . . . . . . X . + . . b .b . . + . . . . . X . . . . X . . X . X . . . . . . . . . . X . . . . . . X X . f . .m . . f . .b X X f . f W @ @ & & & ; & ; & & & & & * & & & & - & : & & & - & & * & * & & * & & & * & = & % @ = Q t ", +" .c z .z z .z z .l p . .m . . f . .M . . f . d W @ @ > & > & & & , & - * & * & , & , & & & , & , & & * & * * , & = & & , & - & * & @ & Q t ", +" .j k .j j .j j .j e . .b . . f . .b . . f . f W $ @ = , , & & , & , - & & * & , & & , & , & & , & = * * * * * - * = , & & , & , & @ & Q t ", +" .P f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f P .P f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f P .P f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f g f f P .P f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f H . .M X . f . .m . . f . f W @ @ ; & & , , & - > - - , & , & , ; ; , & , , & , > * * , - - - - * & , > : , & & @ = Q t ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .b . . f . .b . . f . f W $ @ , = , & , , : & - , - , , , - & , - > & , , * - * - - - , * , * , & , & * & & @ # R y ", +" . . . .M . . . f . . .m . . f . . f W # + * , - , , & , , - - , - , & , , , * , , , & - - - - - - - , : , , , , , , , , @ = R y ", +" . . . . . . . . . . . .M . . f . . .b . X f . . . . f Q @ @ , , , , , , , , , , , - , , , - , , , , , - , , - , , , , , , - , , , , , , = @ @ Q p ", +" . . . . . . . .b . X f . . . . . .m . . f . . y Q # @ & , , , , , , < , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , & @ & Q e ", +" . . . . . . . . . . .M . . g . . . . . . .b . . f . . . . - R 2 @ % , < , , , , , , , , , , , - - , , , , , , , , , < , , , , , , , , < , , , @ @ 9 Q % ", +" . . . . . . . . . . . . . . .b . . f . . . . .m X X f . . . . . X L N # @ @ & & & & & & & = = & - - = = & & = & & = = & = & & = & = = = & & & & % % @ > D P . ", +" . . . . . . . . . . . . . . .M . . f . . . . .b . . f . . . . . i Q c # @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ o @ @ @ & c R 0 ", +" . . . . . . . .m . X f . . . . . .m . . f .. . . h T H y 4 1 1 1 1 1 < < 2 , 1 1 1 1 < < < , < < , < , , < , < , , , < < < , 2 y G R a ", +" . . . . . .b X X f . . . .b . . f . . . 0 H W Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q W W J 6 ", +" . . . . . . . . . . .M X . X . . . . . . . . . . X . . . X . . . . . . X . . . . . . . . . . . . X . . j . . . . .M . . X X X . . . . . . X . . . . . . . . . . . . X . . . X . . . . . . X . o . . f . . . X > 1 1 1 2 2 2 < 2 < 1 < 2 2 1 2 < 2 1 1 2 < 2 < < 2 < 2 1 2 1 2 < 2 % ", +" . . . . . . . .b p . . .b p . . . . ", +" . . . . .l t . . . . .l t .. e e , k Q . .Q k , 9 . . . X . . .9 . . . . . . . . .y , k Q . .J f @ 2 e e . . . . . . . . .y . . . . . .b , 5 ", +" . . . . . .P f f f f f f f f f f p f f f f f f f f f f f f f f f f f f f f f f f f f f f f p J . .P f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f H . .@ @ . X p . . . . . . . .f X . . .9 y . .Q . . . . . . . . .y X k . . . . . . . .y X .@ .@ @ . . . . . . . . . .y . . . . . . . .9 X .@ ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .J . J . X J . . . . . . . . . .J X y . .J Q . .e . . . . . . . . .y @ H . . . . . . . . . ., y .f .J J . . . . . . . . . .y . . . . . . . . ., y .f ", +" .! b b m b b b b b b b b b b b b b b b b b b b b b b b b b b b b M b b b b b b b b I . . . .Q b b m m b b b b b b b b b b b b m b b b b b b b b b b b b b b b b b b b M b b Q .Q b b M b b b b b b b b b m b b b b m b b b b b b b b b b b b b b b b b b M b b Q .Q b b M b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b M b b P .Q b b M b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b M b b P . . . . .y y . . f . . .Q 9 < , e Q . . .a @ . . .< 9 . . .X . . .e < , < , , % . 1 q 8 8 q q 8 8 q 7 q 7 q 9 q 8 9 9 9 8 9 9 9 9 9 8 9 q 8 8 9 9 9 9 4 + + 4 8 7 q 7 q q 9 q 9 9 9 9 8 9 9 9 q 9 9 9 7 q 9 q 9 9 9 9 8 9 9 9 6 , X ; 7 7 9 9 9 9 9 8 9 9 9 q 7 q 9 9 9 9 9 8 9 8 q 7 7 q 9 9 9 q 8 9 9 7 & . f . . .Q e , , e . .9 X . . .X . .y u . . . . .e , , , < , @ . . .e , 6 . . .b @ . . .X ", +" .j t . . . . . . . .g j .g g .j e .k e .. . . . ., , . . . , . . .j + X k . . ., k . .k C . .p . . ., 6 F E W W Q W W W W W W Q E Q E W E Q Q Q Q Q Q Q Q Q Q W Q Q Q W Q W Q W Q Q U g X X t J W Q Q Q E W E E W E E Q Q Q Q Q W E Q Q Q Q Q E W E E Q Q Q Q Q E Q Q W W H e . @ l U Q Q Q Q Q Q Q Q Q Q Q Q W Q E Q W Q Q Q Q Q W E Q E Q Q E Q Q W Q Q Q Q Q C , , . . .k X X 2 9 . . .e . . ., , . . . . . ., . . ., 2 . . . 6 . . .e ", +" .c p . . . . . . . . .z l .k . z .z y .b p . . . . . . . .Q + X Q . . . j . .Q + X Q . .k & . . .@ & . . .@ . . ., 9 Q J s 4 < , , , , , < , , , , , , , , , , < , , , , , , , , , < , , , < , < e n Y V + b W Z e < , , ; : , : , ; , , : , , : , : , , : * , : , ; , , : , , , , , , < t S Q z % A E B 7 , : : ; ; ; ; , ; ; : ; ; : ; , : ; , , , : ; , , , ; , , : : , * - 2 f K Y 6 k . .Q @ Q . . .Q . . .Q X X Q . . . . . .< . . ., , . . . Q . . .Q ", +" .M . X o . . . . . X . . X . . X . X . X . . . . . . . X . X . . X . . . . . + . . f . . . . . . . . . .b . X X . . . . . X . . . X . . . . X . . . . X . . . X . X . X . . + . . b .b X . + . . . . . . X . . . . . . X . . X . X . . . . . . + . . b .b . . X . . . . . X . . . X . X . . . . X . . . X . X . o . . f .M . . X . . . . . . . . . . X . . X . . X . . . . X . . X X . g . . . . . .b b . . . . E . .e e . .Q C . .f k . .b . . ., , K C & @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ O @ @ + t P c w E j $ @ @ @ @ @ @ @ @ @ @ @ @ @ @ + @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ + O @ @ @ @ @ @ z R 0 m U q O O $ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ + @ @ @ O @ @ @ @ @ @ @ @ @ @ @ @ , C K , Q . .e 2 . . . . .9 . . . .b b . . . . . . ., . . ., 9 . . . 2 . . . . .9 ", +" .M X . g . . . . . . . . . . .b . . b .c . . X + X X . . . b .z . . . X . X X X . . . f .b X . X X X . X X X X . f . . . . . . . . .9 9 . . . . . . . ., , . . . 2 . . .& . . ., . . . . . . . . C P % @ @ X X X X . X . X . . X X X . X X . X . X X X . X X . X X . . . . X . X @ @ @ s T , P n @ @ + X . . . X . X X . X X . X . . X X . X X . X . . . . X X . X . X X X X + @ % Z K 2 E i @ @ X X X . X . . X . X X . X X X . X X . X . X . X X . X . X X . X X . X X @ @ < L b . . ., C . . . . .J . . . . .6 9 . . . . . . . . . . . . . . . .w , 9 . . .b C . . . . .J ", +" .b . . f . . . . .b . . * t 9 & . . b .b X - Z ( _ _ ! b * . b .b X - b H D F D D C p & . p .M X @ k G D F D D D D N y . . f . . . . . . . . . .@ @ . . . . . . . . ., , . . . Q . .J . .J . . . . . . . . U j @ @ . . . . . X O : T h , W 6 + + . . . + @ 6 Q # v T @ @ . @ @ h P . . ., & . . .2 . . ., . . . . . .@ @ . . . . . . . . . . . . . . . . . . . . . . .& & . . .2 . . ., ", +" .b . . f . . . . .b X . 0 P P p . . b .b . 4 M ! _ [ [ [ Q M 3 X . b .b X r ` [ T E ! Q I L S 0 . . p .b X 2 ( { Q T ! Q Q Q P g X . f .. . . . . . . . . . .J J . . . . . . Q . .e e . . . 9 . . . . .9 . . . . . . . . E 9 @ + . . . . . . . . . . . . . . O @ K V y W % @ . . . . . . . . . . . . . . . X @ = Q 9 S G @ @ . . . . . . . . . . . . . X @ e W Q . .e k . .C C . .b . . . . . .J J . . . . . . . . . . . . . . . . . . . . . .9 k . .C C . .b ", +" .M . . . f . . . . . . .c . f _ | F X . . b .b . . G _ M < & % 0 S ~ K , . b .b X f .Q 9 y p p f L } I 5 . . f .b X . 7 } _ y 0 p p p p t 2 . f . . . . . .e . . .Q . . .e . . . k . .Q + + Q . .k X . . . .Q . . .e < , , , Q 4 @ X . . . . . . . . . . . . . . . . . . . . . . . . . . . O @ G Z d W % @ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . @ & Q t . G V @ o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . X @ 9 Q k . .Q @ . . .9 2 . . .@ . . .e . . .Q . . .e . . . . . .e , , , , . . .j . . .@ @ . . .9 4 . . .@ ", +" .b X . f . . . . .b . . , j R [ H * . z .b . . 2 T ~ , 9 K I < X b .z X j .D X @ o @ t P ) F & . p .b X 9 | ! + X * @ % @ + . . f . . . . . ., e . . . . .e , . . . , . . .k X X k . . ., f . . .y . . ., Q 6 @ X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . @ @ D S f W @ @ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + % Q t H B @ @ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . O @ 9 W , . . .k @ 2 f . . . . . . . . .k . . ., e . . . . .e , . . . . . ., . . ., Q . .y f . . . . . . . . .k ", +" .M . . & 9 y 0 * X . . X X X . f . . . . . . . .b . @ M M p N C e o . b .z . X 9 T T 2 X . . 9 g % . b .b X g .N . * T _ 9 . p .M X w | I . f .. . . . ., C . . .C , . . . k . . .Q 9 , , e Q . . .b @ . . .@ . . .e , < , < < @ ^ 4 @ X . . . . . . . . . X . . . X . . . . . . . . . . . . . . . . . . . . . . . . @ @ F S f W # @ . . . . . . . . . . X . X . . . . . . . . . . . . . . . . . . . . . . . . . X @ & Q t H B @ o . . . . . . . . . . . . . . . . X . X . . . . . . . . . . . . . . . . . . . O @ 9 Q k . . .J 9 , , 9 Q .9 + . . . . . . . . . . .X . . ., C . . .C , . . . . . .e , , < , , @ . . ., 6 . . .@ X . . . . . . . . . . .X ", +" .b . . 6 S _ ` ) ~ M 7 6 f k 6 . f . . . . . .b X , ( L * 9 S Z 7 . . b .b . . @ T | D y < % . . b .b X j .N . D [ f . f .M X 0 | P . f . . . . . . . ., @ . . .% , . . . X J . . . . . . . . . .H X k .k . . . . . . . . .y Q 6 @ O . . X . . X . . X . . . . . . . . . . . . . . . . . . . . . . . X . . . . . O $ D D f W $ + X . . X . . . . . . . . . . . . . . . X . . . . . . . X . . . . . . . X . . X @ % Q y H V @ o . . . X . . . . . . . . . . . . . . . . . . . . . . . . . . . X X . . X . X O @ 9 Q + J . . . . . . . . . ., e . . .C C C C C . . .y . . ., @ . . .@ , . . . . . . . . . . . .y . . ., C . .C e . . .C C C C C . . .y ", +" .m . X e D Q T ! _ ! H D S z 2 X f . . . .b . . 9 ~ C g E j . . b .b . . b ) ( T P N g 0 + . c .b X f .C X X b ! j X X p .b X 9 } _ k k z k k j * . . f . . . . ., 4 .4 , . . . X k . . . . . . . .k X , .@ . . . . . . . . .y Q 4 @ O . X . . X . . X . X . X X . X X . X . X X . X X . X . X X . X . . X X . X X @ @ F S f W $ # . X . . X . X X X . X X . X X . . X X . . X . X X . X . X . X . . X . . X X X + % W y G B @ @ X . X . . X . X X . X X . X X . X X . X X . X X X . X X . X . X . . X . . X O O q Q X b . . . . . . . .p Q . .y e . . . . . ., 2 .6 , . . . . . . . . . . . .y . . ., , . . .9 Q . .y e . . . ", +" .M . X 6 , . . % u D Q Q b & . f . . . .b . % f K j e ( M . . b .b . % t S ( | .} E f * X b .b X j .C . . c ! z % . p .M X 4 { . .| .| .| t . . f . . . . . ., e , . . . , k . . . .k , y . . . . . . . . .y . Q 6 @ X X X . X . X . X . X X X . X X . X . X . X . X . X X . . X . . X . X . X . X O @ F S f Q @ @ X X X . X . X . X X X . X X . X X . X . . X X X X X X X X X X X X . . X . . X @ & Q t H B @ @ X . . X . X X . X . X X . X . . X . X X X X . . X X X X X . X . X . X X X . O @ q E , k . . .Q k @ 9 . . .X @ . . .9 . . ., e , . . . . . . . . . . . .y . . ., b . . .X 9 . . .X X . . .9 ", +" .b . . + . 6 y p 2 . f . . . . . . . . .b . . 4 D ( E b c K | P , . . b .b . 4 p b F R ~ ) H , . b .b X f .C . . c ~ b % . . p .b X 9 } _ C C C C C M , . f . . Q 2 @ @ X X X . X X X X X X X X X . X X X X X X X X X X X X X X X X X X X X X X X X @ @ G S f Q @ O X X . X X X X X X X X X X . X X X X X X X X X X . X . . X X X X X X X X X X X O # Q t H V @ X X X X X X X X X X X X X X X X X X X X X X X X X . X X X X X X X X X X X X X O @ 7 Q @ , , , & , , & % , , & & < , & ", +" .M . . . . f . . . . . . .b . . j ( ` ) ! T ) { ! j X . b .b . . @ @ X < z { { y . b .b X j .C . . C ` z @ . f .b X w | P X f . . . . Q 6 @ X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X O @ D S f Q @ @ X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X @ & Q t J V @ O X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X @ 9 Q ", +" .b X . f . . . .c . . K } C u k j k N ! T , . . b .c . & u k 0 . X % D _ c % . b .z X g .C . . + . X K } r . p .M X 0 | Y . f . . . . . Q 6 @ @ X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X @ @ D D f Q * @ X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X @ % Q y H M @ @ X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X @ @ 8 Q ", +" .m . . . . . f . @ . . .b . . , I ) 7 . @ * @ , P _ 9 . z .b X @ f Q I * . M [ z X . . b .z X j | b % f ( ! , X p .b X 9 | T . . + . . . . f . Q 6 @ X X X X X X X X X X X X @ X X X X X X X X O X X X X @ X @ X X X X X X X X X X @ @ F Z f Q $ @ X X X X X X X X X X X X X X O X X X O X X O X X X X X O X X X X X X X X X X @ @ # Q y H N @ @ X X X X X X X X X @ X X X @ X X X X @ X X X X X X X X @ X X X X X X X X X X O @ 9 W ", +" .m . . f . . . ., b , . . . , k Q . .J f % . . . . . .b , . . . . . . . . .y 2 y Q .Q y . . . . . . . . .y . . .< . . ., , k Q . .Q k & . . .< , . . . . . . . . . . . . . . . . . . . . .k @ , k Q . .Q k , 9 . . . e J . .k . . . . . . . . .y . . . . . .b , . . . .b X * b K z @ . M ) j . . b .b . , ! { f . . . . @ I { e . b .b X j .C X . + j ( ! f o . f .M X w | T . X f .. . . . . Q 2 @ @ X @ X @ X X X X O X @ X X X @ X X X X O X @ X @ X X X X X X X o O O X @ X O @ $ F S f Q @ @ @ X @ X X X X O X @ @ X X @ X X X X O X X O X O X X O X X X @ X X @ X X O X X @ & Q y . H N @ @ X X @ X X @ X X X X @ X X X X X X X @ X X X X X X X X X X @ X X @ X X @ @ X @ O q Q ", +" .b . . f . . . ., .k < . . . X k . . . . . . . .y . . . . . . . .9 . . . . . . . . .y @ .@ b . . . . .b . . . . . . . . .y . . ., . . ., X f . . . . . . . .f X . . ., < . . . . . . . . . . . . . . . . . . . . . . ., X f . . . . . . . .f o X . . .9 X .@ & . . .& . . . . . . . . .y . . . . . . . .6 .b X y _ P 2 u T P y . b .b . . g ! _ Q G N K ~ ) D * . . b .b @ f .| ( ( ) ( ~ ( ! g @ . . p .b X e .( . . f . Q 6 @ @ X X X X @ X @ @ X X X X @ @ X X @ O X 6 e @ X @ X @ X @ X @ X O o X O O O O @ @ F S f Q # @ @ X X @ X @ @ X X X @ X @ X @ X X @ O X O O O O X @ X @ X @ X @ @ X X @ X @ @ @ # Q y H N @ @ @ X X o o o O X X X X X X @ O @ f z X X O @ O O O @ @ X @ X O X @ X @ X @ X O @ 9 Q ", +" .m . . f . . . ., . .j , . . . + J . . . . . . . . . ., . . . . . . . . ., . . . . . . . . .y y .f y . . . . . . .y . . . . . . . . .y . . ., . . ., J . . . . . . . . . .y . . ., , . . . . . . . . . . . . . . . . . . . . . . . .% + J . . . . . . . . . .J X k . .C 9 .f k . .J . . . . . . . . .y . . . . . . . . .< .b X e ! b X . . , j S f . . b .b . . @ f ~ [ ) Q ( ` G 4 . . b .b X 9 ( _ { { { { ` P f @ . f .b X 6 ( D . . f . Q 6 @ @ X @ @ @ X @ X O @ @ X @ X @ @ @ X * C ` b X @ X @ X @ X @ X @ X @ O O O O O @ @ F S f Q @ # X @ @ X @ X O @ @ X @ X @ @ X @ e P P T P P T T 6 X @ O @ X @ X @ @ @ X @ X @ @ & Q y H N @ @ X @ @ o @ O O @ @ @ @ @ @ X O X b _ ( e @ X @ X @ X @ X @ X O O X @ X @ X @ @ @ 9 Q ", +" .b . . f . . . .< . . .k , . . . a . . .Q e , , e . .9 . . .e , 6 . . .b . . .e , < , < , % X . . .X Q . .C , b . .Q . . .e , , , < , @ . . .< . . ., f . . . .y , < e . .k . . ., , . . . , , < e . . ., , < , . . .e , , e . . .k a . . .Q 9 , , e Q . . .f , . . .@ J . . @ . . .9 . . .e , < , , < # . . .e , 6 . . .b .z . X % + X @ X . b .z . X & 9 f l y , @ . X b .b . . & * , , , , - % X . f .b . . & @ . f . Q 6 @ @ O O O @ + @ + @ O O O + @ O O @ k ) ` ' n O O O @ @ o @ O + @ O O @ + @ O O @ @ F S g W # @ @ o + o O + O O @ + @ O X @ @ @ @ ! _ ' ' ' ' T @ + @ O + @ O + @ O O @ @ X @ @ # Q t . H V + @ o o O O O O O O O O O o o @ O O n ' ' ' U 2 @ X @ X @ X @ X O O + O O o @ @ @ @ 9 Q ", +" .M . . f . . . ., . . . .k , . . . , . . .k X @ 2 . . .< 4 . . . . . .< 9 . . .e . . ., & C C C . . .< . . ., . . ., @ . . .J X X k . . ., < . . . , . . . . . ., e . . ., . . .k X + k . . ., Q . .f @ . . .6 6 . . .X . . ., . . ., 2 . . . .b . . b .b . @ & . b .b . . p .M . . f . Q 5 @ @ @ @ @ @ O @ @ + @ + @ @ @ O r ~ [ ` ' ' n O @ O @ @ @ @ o @ + @ @ @ O @ @ @ @ @ F S f W # @ @ @ @ @ @ @ @ @ @ O @ @ @ @ X @ @ y [ ` ' ' ' e @ @ @ o @ + @ @ @ @ o @ @ @ @ @ # Q t . H V @ @ @ @ + @ @ @ @ @ @ @ @ @ @ @ O O n ' ' ' ' ` b @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ O @ 7 Q ", +" .m . . f . . . ., . . . . .k , . . . k . .Q + . . ., , . . . . . ., Q . . .Q . . .9 . . ., . . ., . . ., y . . .* . . ., < . . . , . . . . . ., , . . .j . .Q + X Q . .k e . .Q f . . .b C . .k . . ., . . ., , . . . .b . . . . b .b . . . b .b . . . . . p .b . . . f . . Q 5 @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ~ ` [ ` ' ' n @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ H S f W # + @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ T _ ' ' F @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ & Q y . H B @ @ @ @ @ O + @ @ @ @ @ @ @ @ @ $ @ n ' ' ] ` ` D @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ 8 Q ", +" .m . . . . f . . . ., . . . . . .k < . . . Q . .e . . ., 9 . . . . . ., 2 . . . . .9 k . . .e @ . . ., . . .< . . ., C . .k . . ., , . . . < . . . . . .< 9 . . .Q . .e e . .Q X . . .2 . . . . ., . . .& . . ., . . ., 9 . . . .b . . b .b . . . . b .z . . . . . . f .b . . f . . Q 6 @ O @ @ @ @ @ @ @ # @ @ @ @ @ @ @ M ) ' ' ' M $ @ @ $ @ # @ @ @ @ @ @ @ @ @ @ @ @ @ D S f W % @ @ # @ @ @ @ @ @ @ @ @ @ & @ @ @ @ @ 9 [ ' ) : $ @ @ @ @ @ @ @ @ # @ @ @ @ & @ @ # Q y . G B @ @ @ @ @ * @ @ @ @ @ @ @ @ @ @ $ $ B ' ' ] Y 9 # @ @ # @ @ @ # @ @ @ @ @ @ @ @ @ @ 9 Q ", +" .b . . f . . . ., . . .b . . .j , . . . . . ., . . .e , 6 . . .b . . . . . . . . C . . . . .J @ H . . . .p + . . . . . . . . . . ., . . ., . . .4 . . . . . . . . . . . . . . . . . . . , . . . . . ., , . . .b . . ., , . . . k . . . . . . . . . . .Q . . . . . . . . . . .e , 9 . . .b .b X . b .b . X c .c . . p .b . . f . Q 4 @ % @ % @ @ * @ @ @ @ # # @ @ @ # # * G _ [ M $ @ $ $ @ # @ @ @ % @ % # # @ # @ @ @ D S f W $ @ @ @ @ @ @ % % @ # # @ # @ & @ @ $ @ @ G ' n O $ @ * @ @ @ @ @ % # @ # # @ # @ @ # Q y H B o @ @ @ % @ @ % # @ # # @ @ % @ $ @ n ' / g % @ # & @ @ @ @ @ # # @ # # @ % @ @ $ @ 8 Q ", +" .M X . f . . . ., . . ., j . . .J . . . . . ., . . . . . . . . .& . . . . . . . . & . . .4 . . ., + b . . . .J X . . . . . . . . . . ., . . ., . . ., . . . . . . . . . . . . . . . . . . . , . . . . . . . . . . . . .& . . ., , . . . 2 . . . . .J . . . . .e . . . . . . . . . . . . . . . . .& .b . . b .c . . b .b . . p .M . X f . Q 4 @ @ % % % @ @ @ # @ * * # * @ @ * # @ $ r P M $ % % % @ & * @ % @ % % @ # # # & @ @ D D f W # @ * @ * @ % @ % % # @ # # & @ & @ % $ & , Q ; $ $ @ % @ & % % % % # # # # @ # @ @ % Q y H B @ @ @ * @ % % % # # # # @ * @ * $ $ g n , % % % # @ @ & * @ # # # # # # % @ % % @ @ 7 Q ", +" .b . @ y j & X f . . . ., . . ., j . . . . . . Q . .e . . . . . . . .9 . . . . . . . . k . .C C . .b @ k . . .k . . . . . . . . . . ., . . ., . . .2 . . . . . . . . . . . . . . . . . . . < . . . . . . . . . . . .9 Q . .e e . . . Q . . . .@ . . . . .X . . . . . . . . . . . . . . . .9 .z . . b .b . . b .b X . f .M X . f . Q 6 @ @ $ % % * @ * @ @ @ @ @ @ # # # # @ % % @ @ % @ % @ & @ * @ % * # # * # # # # @ @ D S f W # + & @ * @ % % # & # # # # @ @ & & % * $ $ % % % % & @ * @ % * # # * @ # @ * @ # @ % Q t H B @ @ % @ % % # # * # * @ @ @ $ % % % % % % @ # & # @ & @ @ # # # @ @ * @ % % # % @ @ 9 Q ", +" .M . & D ( f . . f . . . ., . . ., j . . . . . k . .Q . . .k . . .@ . . .e , , < , % . . .7 4 . . .@ 2 . . . . . .e , , , , . . ., . . ., b . .b , < , , C . .b . . .e , , , e . . . , . . . . . . . . . .C , k . .Q X X Q . .k y . . .b k . . .j . . .e , , , , . . .k . . .@ .b . . b .b X . b .b . X p .b . . f . Q 4 @ % & % % @ * # * * # # * * # * @ # * * % * @ * * @ * @ * @ @ * @ & % # # * # & @ @ D D g W @ @ @ * @ % @ * % % * # * # & & & @ % $ * % % $ & % @ * @ % & @ & % @ * # * # & @ @ # Q t H B @ @ * * @ * & % # # @ * * @ * % % * % % & % & % & * @ * * @ * @ * * @ * % & & % @ @ 8 Q ", +" .m . . . j ! H 9 . X f . . . ., . . ., k . . . . , . . .k X 6 . . ., Q . .y . . ., f . . . . . . . . .k C C C & , . . . . . ., . . ., . . ., 9 . . .e 7 . . .9 . . .< , . . . , . . . . . .e , , , . . .k + @ k . . ., @ . . .9 & . . ., . . ., . . ., Q . .y .b . . b .b X . b .z X . p .M . . f . ^ 4 O $ % % & & & & % & & % & % & & % & & % % % * @ * @ * & % & & % & % & & & $ & ; @ O F S f W % @ % % & % & % & & % & % & % & % & * $ @ & & & @ * % & & % & & & & & % & & & & % @ & Q y H B @ @ % % & & % & # * # # * # * @ & % & & % & % & & & # & & # & & & & & % & & & & $ @ 9 Q ", +" .m . , g g 6 . . f . . . .< . . .< k . . . k . . .J 9 , , 9 Q .9 . . .< 2 . . .@ . . .e , , < , < @ X . . . . . . . . . . .o H . .C , C . .Q . . .e , , , , < @ . . .e , , , < , # . . ., C . . .C 9 , < 2 C . . .C . . ., < . . . , . . . . . ., k . . .Q 9 , , e Q . . .b b . . Q .Q . . .e , , < , , % . . ., 6 . . .@ .b . . b .c . . b .b . . f .b X X f . Q 4 @ @ & & & & & & & & & & & & & & & & & % * % * * % * # & & & & & & & & & & & & % O $ F D f W # @ % & & & & & & & & & & & & & & & @ * & & & & & & & & & & & & & & & & & & & & % @ & Q t H B @ @ & & & & & & * # * @ # * * * & & & & & & & & & & & & & & & & & & & & & & & & @ @ 7 Q ", +" .b . . f . . . ., . . ., k . . X J . . . . . . . . . ., . . ., C . .C . . . . . . . . .y e . . .C C C C C . . .y e . . . . . . .y . . . . . . . . .y . . . . . . . . .u . . ., X J . . . . . . . . . .J X . . ., < . . . < . . . . . ., X J . . . . . . . . . .H X 2 .k e .y . . . . . . . . .y . . ., C . .C .b . . c .b . . b .b . . p .b . . f . Q 4 @ $ & & & & & & & & & & & & * & & & & * * @ % * # & & & & & & & & & & & & & & ; O $ F D f W % @ & & & & & & & & & & & & & & & & * % * & & & & & & * & & & & & & & & & & & & & @ & Q t G B @ @ & & & & & & * * # * # * # * & & & & & & & & & & & & & & & & & & & & & & & & $ O 9 Q ", +" .M . . f . . . ., . . ., k . X b . . . . . . . .f . . .< , . . .9 . . . . . . . . .y Q . .y e . . . k . . . . .b . . . . . . . . .y . . . . . . . . .u . . .< X j . . . . . . . .k X . . ., , . . . , . . . . . .< X j . . . . . . . .j X ., @ .% . . . . . . . . .y . . .< , . . .9 .b . . b .b . . c .b . . p .M . . f . Q 6 @ $ ; & * & & * & = & & * & & * & & & * * * * * * & * & & , & & * & * & & & ; & @ @ F S d W # @ & & - & = & * & & * - & & * : & * * & * * & & * & & & & & & * & & * & * & & & @ & Q y H V @ @ ; & & * & & * # * * * * # * & & , & & * & * * & * & * * & * & & & & & & * & $ O q W ", +" .b . . . . f . . . ., . . ., b , k . . .Q k @ . . ., b . . .X . . . . . . . . .y 9 . . .+ X . . .6 y Q .Q y . . . . . . . . .y . . . . . . . . .y . . ., , k . . . .k , . . ., , . . . , . . . . . ., , k . . . .k , e e . . . . . . . . .y . . ., b . . .X .z . . b .b . X b .b . . p .b . . f . Q 6 @ % * - & - & & & * & - & - & & ; & - & : & - & & * * & & ; & & , & & : & : & ; @ @ F D g W # + & , & & , & & & - & : & ; & , & & , ; & * & & - & & : , - & & & * & & - & & & @ # Q t G V @ @ & & , & , & - & = & * * * * & & ; & & ; & = * * * * * # * * & * & , * & = & $ @ 9 Q ", +" .M . . f . X @ , , & , , , * .b . . b .z . . b .b . X f .M . . f . Q 6 @ % & * = & , , & - ; , & & , - * , & : & , & * * & - , & , & & & , & : ; & , ; @ @ F D f W # @ , & & , & , , & , & & , & & & - & & - = * - - = , & > & > & , , * - - = , & & @ = Q t H B @ @ , & , & & & & = * - * * * * , & - ; , & , & - * * * * * * * & , , & , & , = $ @ 7 Q ", +" .b X . f . .b X . b .b . . b .b . . p .b X . f . Q 5 @ % , - * , & & , > - , & , ; , & , : : : - ; = = - - & - - & , - & , , * , & : @ @ F S f W % @ & , & & , & , , , & , & & , , & , , - - - - - * & - - & , & , & , & , & & ; & @ # Q y J B @ @ , * & & , , , - = = - - * * ; - - > * - & , - - - - - - * * , & & , & , > - $ @ 9 Q ", +" .M . . f . .b . . b .b . . b .z . . f .M . . f . Q 5 @ % & , ; , , , & , = , , & , & , ; : : , - = , , - - , ; , , ; , , , & = , , ; O $ F S f W # @ , & , , & , , & , = , , , , & , , & - - - - - - , ; , , > , & , * , ; , , , - @ # Q y H N @ @ , : , , , & & , - - - - - - , & , , & , , & , - - - - - * * & , , & , = > - & @ 7 Q ", +" .b . . f . .b . . c .b . X c .c X . f .b . . f . Q 6 @ # , - , , , - , , , , & , - , - , = - , , , - , , , - , , - , = , - - , , , > @ O F D f Q @ @ , - - , , - , - , , , , , , , , * , , , - , - , , , , * , - , , - , * , , > & @ $ Q y H V @ @ , - , - - , , , > , , , , * , - , , - , & , , , - - , , , , , , , * , - , = # @ 8 Q ", +" .M . . f . .b . . b .b . . b .b . . p .M . . f . Q 6 @ % , , , , - , , , , , , , , , , , , , , , - , , , , , , , , , , , , , , , , , @ $ F H f Q # @ - , , , , , , , , & * , , , , - , , , , , , , , , , , , , , , , , , , , , , & @ $ W p H V @ @ , , , , , < , , , , , , , , , , , , , , , , , , , , , : , , , - , , - , , , # @ 3 Q ", +" .b . X f . .z . X b .b . . b .b . . p .b . X f . Q w @ # , , , , < , , , , , , , , , , , , , , , , , , , , , , , , , , , , , < , < , @ $ L Z y R = @ = , , , , < , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , & @ ; Q w A H @ @ , , , , , , , , , , , , , , , , , , , , , , , < , , , , , , , , , , < , , , # @ e W ", +" .M X . f . .b X . c .c . . b .b . . f .b . . f . P c @ @ , < < , , , , < , , , < < < , , , , < < < , , < , , , , < < , , , , < < , % @ < W a = W 9 @ # , , < , , < < < < , , < , < , , , , < , , , , , < , , , , , < < , , , < , @ @ r Q $ j T , @ & , < , < , , , , , , < , < , , , < < , , , , < , < , , , < < , , , < , < , @ @ M P ", +" .b . . f . .b . . b .c X . b .z . . p .b . . f . l I 3 @ @ % % % % % % # % % % % % & % % & % % % % % $ & % = # # # % % & % % % % @ @ $ b Y @ . J Z - @ @ # % # & # # % % % % % & % % & $ % $ & % % # $ % % % % $ % % # & & # # @ @ , H G , Q k # @ % @ % % % & % % % % % $ % % & % % % % & # % % % % % % % % % & & % % & % @ @ 6 R a ", +" .M X . f . .b . . b .b . . b .b . . p .M X . f . $ I D 5 @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ s E d 9 R M & @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ , M U 2 z T u @ @ @ @ @ @ @ @ @ @ @ @ $ @ @ @ @ @ @ % @ @ @ @ @ @ @ @ @ $ @ @ @ @ @ @ @ @ 6 G K X ", +" .b . . f . .b . . z .b . . b .b . . f .M . . f . , H T V p e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e r h K W c t I P c t w 0 e 0 e e e q w w w e q w w w e e e w w q q q e 0 0 q q w w w 9 e c T T t c R H k t e r e e r e e e e r e e e r r e e e e r r e r e e e e e e t e e t p M R H 2 ", +" .m . . f . .b . . b .b . . c .b . X p .b . . f . & l L R Q Q Q R Q Q Q Q Q Q Q Q Q Q Q Q Q W Q Q Q Q Q Q Q Q Q Q Q Q Q Q W E T A 9 . , M T Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q T M , e G R Q Q W Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q T L h # ", +" .M . . + . . . . . . . . . . . X . . . . . X . . X . . . . . . . . . . . X . X . . g . .b . . + . . . . . . . . . . . . X . . . . . X . . X . . . . . . . . . . . + . . b .b . . + . . . X . . . . . . . . . . . . . . X . . . . . X . . . X . . . . X . . b .b . . X . . . . . . X . . X . . . . . . . . . . . . . . X . . . . . X . . + . . f .m . . + . . . . X . . . . . . . X . . X . . . . . . . . . . . . . . X . . . + . . f . ", +" .b p . .l z .l z .z u .b p . ", +" .k t . .j k .j j .j r .k y . ", +" .I f f g f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f g f f H . .P f f g f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f g f f P .P f f g f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f P .P f f g f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f g f f G .I f f g f f f p f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f H . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" .Q b b M b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b M b b P . .Q b b M b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b M b b P . ", +" .j e . .j e . ", +" .b p . .l y . ", +" .M . . X X . . X . . . X . . . X . . . X . . . . . . . . X . . . . . . . . . . . . X . . . . X . . . . . . X . . . . X X . . g . .b . . X . X . . X . . . . X . . . . . . X . . . . X . . . . . . . . . . . . . . X . . . . X . . . . . . X . . . . X . . . . . . . . . . . . . . X . . . . X . . . . . . X . . . . X . . . . . . X . . . . . . . X . . . . . . . . . . . . . . . X . . . . X . . . . . . X . . . . X . . . . . . X . . . . . . . X . . . . . . . . . . . . X . . . . . . X . . . X . . . . X . . . . . . X . . . X . . . . . . . X . . . . . . . . . . . . . . . X . . . . X . . . . . . X . . . . X . . . . . . X . . . . . . . X . . . . . . . . . . . . X . . . . . . X . . . X . . + . X f . ", +" .b . . f . .b X . p . ", +" .b . X f . .b . X p . ", +" .m . . f . .b . . p . ", +" .b . . f . .b . X p . ", +" .b . X f . .b . . f . ", +" .M . . f . .b . . p . ", +" .b . . f . .b . . f . ", +" .b . . . . f . .b . . f . ", +" .M . . f . .b . X p . ", +" .b . . f . .b X . p . ", +" .b . + & * * - * , % + X % + . . . f . X .b . . f . ", +" .M k I I P P P L S u * . . . . 2 H f . . . . . 4 9 X . . . . . f . e e . . . . . . . . .y b < . . . . . ., , . . . .b . . p . ", +" .b . T | ! H Y I P L T D 6 y { D . @ c z . . . f . .@ @ . . . . . . . . . .y .k , . . . . . .< , . . . .b . . f . X ", +" .b X ( } f , e e 0 f ! } Z , . i .J . X t E K % . f . .J J . . . . . . . . . .y . .k , . . . . . ., , . . . .b . . p . . . . . . .b , . . . . . . . . .y . . . . .b & , j Q . .Q k , , k Q . .Q k , . . . . . . . . . . . 2 b , . . . . . . . .Q f @ . . . . . .b , . . . . . . . . .y . . ., , k Q . .Q k , 6 . . . . .Q p @ ", +" .M X ) } , + + . @ p P ) M X 9 b G b 0 + p .L 4 b D b e @ 2 Z _ ~ p * % f Z C f , f . . .y y . . . . .e , , < , < % . . .k , . . . . . ., < . . . .b . . f . . . . . . . . .9 . . . . . . . . .y . . . . . . .& X p . . . . . . . .f X @ f . . . . . . . .p @ . . . . . . . . . . . @ .@ .k , . . . . . . . . . . .f . . . . . . . .9 . . . . . . . . .y . . ., + p . . . . . . . .p X @ .@ . . . . . . . .f ", +" .m X ) [ & 0 _ Q + % g K Q ~ ! K f O i | L . @ t S E ! Q K g * 6 T { _ S < . - b P ! ! P M 7 O f . . . ., , . . . . . ., . . . .k , . . . . . ., , . . . .b . . p . . . . . . . . . ., . . . . . . . . .y . . . . . . .b + H . . . . . . . . . .J X X J . . . . . . . . . .J X . . . . . . . . . . . y .y . .k , . . . . . . . . . . . .C . . . . . . . . ., . . . . . . . . .y . . .< + H . . . . . . . . . .J X y .y . . . . . . . . .C ", +" .b . ) [ & * ! ! 4 y _ [ M f D _ ! p t | P . u ) ( b f M ! ) N X , I { _ S % O K [ H f j K ) T t g . . . .Q X @ Q . . . . . .< . . . . .j , . . . . . ., , . . . .b . . f . . . .e , 6 . . .b . . .e , < , , , % . . .e 9 . . . f . . .Q 6 , , e Q . . .f f . . .Q 9 , , e Q . . .p , , , e . . ., , , , X . . .+ . . .k < . . . . . .e , 9 Q . . .y . . .e , 6 . . .b . . .e , , , , , % . . ., p . . .Q 7 , , e Q . . .f X . . .X . . .e , 6 Q . . .y ", +" .b X ) { * . . . @ P I w 3 M T M . . @ u T K @ 0 | K . @ M ) M . 9 ! ! - X b ) Q t o e E T , . . - D _ b f . . . . .b b . . . . . . ., . . . . . .k , . . . . . ., < . . . .b . . p . . . ., 2 . . . . . ., . . ., & . .Q , . . .k X @ j . . ., , . . .j X @ k . . ., , . . . 9 . . .e . . . .j , . . . . . ., + b . . .X . . ., 2 . . . . . ., . . .< , . . .k + X k . . ., 9 . . .e . . ., @ b . . .X ", +" .m X ) { * . . % P L t c P N 9 X @ X + K { 4 4 | H 4 H K y + @ @ X P ` y . r T H X X b P M @ O O X f [ K . f . . . . . .9 6 . . . . . . . . . . . . . . . .b . . .k , . . . . . ., , . . . .b . . f . . . ., , . . . . . .< . . . . . . .Q 2 k . .Q @ + Q . .k k . .E + X Q . .k < . . . Q . . .Q . . . . .k , . . . . . ., X . . .9 . . ., , . . . . . ., . . ., k . .Q X + Q . .k Q . . .Q . . ., X . . .7 ", +" .b X ) [ * . . & P I y b ) [ ` _ _ ) ) . .3 2 | K 6 R } [ ) _ ) ) .| z @ 0 T H X X C [ { _ _ _ ) { .Q * p . . . . . . .@ @ . . . . . . . . . . . . . . . . ., k . . .J . . . . . ., , . . . .b . . p . . . ., 9 . . . . . ., . . . . . . . . .f Q . .e e . .Q Q . .e e . .Q , . . . 9 . . . . .9 . . . . . .j , . . . . . ., k . .p . . ., 9 . . . . . ., . . ., Q . .e e . .Q 9 . . . . .9 . . .< k . .a ", +" .m X ) { * X . . % ( Q 6 k ) { _ ` ` ` _ ! I @ 0 | H 0 E { [ _ [ [ _ ( K 0 * y Q H @ @ Z _ [ ` _ [ ` ) Q c & p . . . . . . .J H . . . . . . . . . . . . . . . . ., j . . . . . . . . ., , . . . .b . . f . . . .e , 9 . . .b . . . . . . . . . . . . . . . . . ., . . ., , . . . . . ., , . . . < . . . C . . . . .C . . .b . . .k , . . . . . .< y . .C . . .e , 9 . . .b . . . . . . . . . . ., . . ., , . . . C . . . . .C . . ., y . .C ", +" .b . ) { , . . . . 6 { T . p ! M 4 @ * % + * * y | H 0 K F t @ @ % @ * * . X t Q H @ * C K k * % % @ * * * f . . . .e . . .Q . . .e . . . . . .e < , , , . . ., k . . . . . . . ., 2 . . . .b . . f . . . . . . . . . .& . . . . . . . . . . ., X C . .b . . ., , . . . . . ., , . . . , . . . , . . .2 . . ., . . ., k . . .J . . . . . ., y . .C . . . . . . . . .& . . . . . . . . . . .< . . .< , . . . , . . .2 . . ., . . .< y . .C ", +" .M X ) _ e K ) z . 7 I K w p j X w | H * D ( f j b * . u ! D f ~ H . 3 C y g . . . ., e . . . . .e , . . . . . ., . . ., j . . . . C . .b C . .b .b X . p . . . . . . . . .9 . . . . . . . . . . ., 5 . . .Q . .e e . . . Q . .e e . . . , . . . k . .C C . .k . . ., k . . . . . . . . ., k . .f . . . . . . . .9 . . . . . . . . . . ., Q . .e w . . . k . .C C . .k . . ., k . .p ", +" .b X ) } 0 - , , - e P _ D 2 * b _ T e < 9 M ( E @ 0 .P k { ~ u 2 2 j [ _ 7 e ~ ~ 9 X < ! { M 3 2 w T | C f . . . ., C . . .C , . . . . . .e , < < , , # . . ., k . . . 9 . . .b , , b . . .2 .b . . f . . . .k . . .@ . . .e , , < , . . .< , . . .k . .Q X + Q . .k k . .Q X X Q . .k , . . . @ . . .6 2 . . .@ . . .< k . . . . . . . ., o . . .9 . . .k . . .@ . . .e , , < , . . ., k . .Q X + Q . .k @ . . .9 2 . . .@ . . ., X . . .9 ", +" .b . ) .} [ } } { _ ( D 2 . . , N ( [ } { _ K e . p .R 2 M ~ [ { { [ R g % , E .{ f . t T _ { { { ( C 6 . f . . . ., % . . .@ , . . . . . . . . . . . .y . . .< k . . b . . . . . . . .b .b . . p . . . ., Q . .y . . .< . . .< y . .Q , . . .j + X k . . ., , . . .k @ + k . . ., < . . . f . . . . . . . . .k . . .< k . . . . . . ., X b . . .X . . ., Q . .y . . ., . . .< , . . .k + X k . . ., f . . . . . . . . .k . . ., + b . . .X ", +" .b . c T ~ ~ ( ( ( T b 4 2 c Q ( ! G 0 . 9 P l . * k Q ( ( P t . . f E ! p y K ~ ( ! b @ f . . . ., 2 .4 < . . . . . . . . . . . .y . . ., k . @ C . . . . . .b X .b . . p . . . ., 4 . . .@ . . .e , < , , , @ . . .e , , e . . .k k . . .Q 9 , , e Q . . .b k . . .Q 9 , , e Q . . .b , . . . X . . . . . . . . . . .X . . ., k . . . . . .e , e Q . . .y . . ., 6 . . .@ . . .e , , < , , % . . .e , , , < , @ k . . .Q 9 , < e Q . . .b @ . . . . . . . . . . .@ . . .e , e Q . . .y ", +" .M . . . . . . . . . . . . . . . . f . . . ., e , . . . . . . . . . . . .y . . ., b 6 J . .J 9 .b . . f . . . ., C . .C . . . . . . . . .y . . . . . . . . . .@ X J . . . . . . . . . .H + X H . . . . . . . . . .J + , . . . i . . .C C C C C . . .y . . ., j . . . . . . . . . . .C . . ., C . .C . . . . . . . . .y . . . . . . . . .y X J . . . . . . . . . .J X y . . .C C C C C . . .y . . . . . . . . .C ", +" .b . . f . X .b . . p . . . ., , . . .9 . . . . . . . . .y . . . . . . . . ., + k . . . . . . . .k X + k . . . . . . . .k X , . . . Q . .y y . .Q . . ., k . . . . . . . . .f . . ., , . . .9 . . . . . . . . .y . . . . . . . . .y @ k . . . . . . . .k O Q . .y y . .Q . . . . . . . .f ", +" .M . . . X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . f . .b . X f . . . .< b . . .X . . . . . . . . .i . . . . . . .k @ , k . . . .k , , k . . . .k , < . . . 9 . . .X + . . .9 . . ., b . . . . .Q f @ . . ., b . . .X . . . . . . . . .y . . . . . . . . .y , j . . . .k , 9 . . .X @ . . .9 . . . . .Q f @ ", +" .b . X f . .b . . p . & < < & , , , & X - , , & * , , & ", +" .b . . f . .b . . f . ", +" .b . . f . .b . . p . ", +" .b X . f . .b . . p . ", +" .M . . f . .b . . f . ", +" .b . . f . .b . X p . ", +" .b X . f . .b . X p . ", +" .b . X f . .b X . p . ", +" .m . . f . .b . . f . ", +" .b . . f . .b . . p . ", +" .b . . p . .b . . p . ", +" .M . . + . . X . . X . . . . . . . . . . . . . X . . . . . . . X . X . . . . . . . . . . . . . X . . . . . . . X . X . + . . f . .b . . X . . . . X . . . . . . . . . . . . . X . . . . . . . X . . . . . . . X . . . . . . . X . X . . . . . . . . . . . . . X . . . . . . . X . X . . . . . . . . . . . . . X . . . . . . . X . . . . . . . . . X . . . . . . . . . . . . . . . X . . . . . . . . . . . . . . . X . . . . . . . . . . . . . . . X . . . . . . . X . . . . . . . . . . . . . X . . . . . . . X . X . . . . . . . . . . . . . X . . . . . . . X . X . . . . . . . . . . . . . X . . . . . . . X . X . . . . . . . . . . . . . X . . . . . . . X . X . . . . . . . . . . . . . X . . . . X . . f . ", +" .b p . .z p . ", +" .l t . .k t . ", +" .P f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f H . .P f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f p H . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" " +}; diff --git a/xpm/loading.xpm b/xpm/loading.xpm new file mode 100644 index 0000000..3c3929e --- /dev/null +++ b/xpm/loading.xpm @@ -0,0 +1,702 @@ +/* XPM */ +static char *_484132443063[] = { +/* columns rows colors chars-per-pixel */ +"1000 640 56 1 ", +" c #000000", +". c #090907", +"X c #060608", +"o c #0D0D0D", +"O c #10110C", +"+ c #151515", +"@ c #191917", +"# c #1D1D1D", +"$ c #262626", +"% c #282826", +"& c #2E2E2E", +"* c #353534", +"= c #383836", +"- c #393939", +"; c #424242", +": c #4D4D4D", +"> c #565655", +", c #585858", +"< c #656565", +"1 c #6E6E6D", +"2 c #71716F", +"3 c #747473", +"4 c #787876", +"5 c #7B7B7A", +"6 c #81817F", +"7 c #848483", +"8 c #888886", +"9 c #8D8D8C", +"0 c #91918F", +"q c #969695", +"w c #999A97", +"e c #9B9C9A", +"r c #A1A19F", +"t c #A3A4A2", +"y c #A9AAA6", +"u c #AEAEAC", +"i c #B1B1AF", +"p c #B3B3B3", +"a c #B9B9B6", +"s c #B9B9B9", +"d c #C1C2BE", +"f c #C4C4C3", +"g c #C8C8C6", +"h c #CDCDCB", +"j c #D5D5D4", +"k c #D9D9D7", +"l c #DBDBDA", +"z c #E5E5E3", +"x c #EBECE6", +"c c #EDEEEA", +"v c #EFF0EB", +"b c #F2F3EE", +"n c #F5F6F3", +"m c #F7F8F3", +"M c #FBFBF6", +"N c #FFFFFD", +/* pixels */ +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" X ", +" X X X ", +" + - ", +" NNNNNNNNN: #-<7pNNNNp7,-# X qO NNNNNNNNNNNNNNw7,&+ NNNNNNNNN> N- :NNNNNNNNN #-<7pNNNN77:-@ ", +" NNNNNNNNN: +,pNNNNNNNNNNNNNNp,+ &N- NNNNNNNNNNNNNNNNNNNq;+ NNNNNNNNN: NN- :NNNNNNNNN +,pNNNNNNNNNNNNNNq;+ ", +" NNNNNNNNN: $4NNNNNNNNNNNNNNNNNNNN<# X7Np NNNNNNNNNNNNNNNNNNNNNN,O NNNNNNNNN: NNN- :NNNNNNNNN #4NNNNNNNNNNNNNNNNNNNN<+ ", +" NNNNNNNNN: o::::::::# +:::::::::: - -3NN7- -3NN7- -3NN7- ", +" X ", +" X X ", +" X X ", +" X X ", +" X X X ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" X X X X X X ", +" X X X ", +" X X ", +" .. X. . XX X X XX XX XXX XXX X XXX XXX X XX XX X X X XX X XX XXX XX XX XXX X X ", +" XX X X ", +" oX qqqqqqqqqq0qqqqqqqqqqeqe8qqqqqqqqqqqqqqqqqqq0q0qeN, ", +" X 2NmMNNMNMNMMNMNMNMNMNNMmNl% . 7NmMNMNMNMNMNNNMNNMMMNuo 8NMMNNMMNMNNNMNMNNNNNMMmNu X pNN7$3NNp ,NNNp;%$;NN- NNN;$$$$$+ NNN;=NNN NNN$ $NNN NNN$ oNNN+ ", +" XoX 2NbMmNMNMNNMNMNMMMNMNNbnNj$ X 8NmNMMNMMNMNMMMNNmbbNyo 7NMNMMNMMNNNMNMNMMMMMMNmNp NNN$ #777 %NNN c gray30", +", c #565655", +"< c #585858", +"1 c #656565", +"2 c #6E6E6E", +"3 c #71726F", +"4 c #747473", +"5 c #7B7B7A", +"6 c #81817F", +"7 c #848483", +"8 c #888886", +"9 c #8D8D8C", +"0 c #91918E", +"q c #959594", +"w c #999996", +"e c #9D9D9B", +"r c #A1A19F", +"t c #A3A4A2", +"y c #A9AAA6", +"u c #AEAEAC", +"i c #AFB0AB", +"p c #B1B1AF", +"a c #B3B3B2", +"s c #B9B9B6", +"d c #BABABA", +"f c #C1C2BE", +"g c #C4C4C4", +"h c #C8C8C6", +"j c #CDCDCB", +"k c #D6D6D4", +"l c #D9D9D7", +"z c #DBDBDA", +"x c #E5E5E3", +"c c #EAEBE6", +"v c #EEEEEB", +"b c #EFF0EA", +"n c #F2F3EE", +"m c #F5F6F2", +"M c #F7F8F3", +"N c #FBFCF6", +"B c #FEFFFB", +/* pixels */ +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" . . . . . . . . X . . X X X X X X . X X . . X X X X X . X X . X . . . . X ", +" X X X X X X X X X X X X X . X X X X X X X X X X X X X X . . X X X X . . X . X X X X X . . X X X X . . X X X X . X X X . . X X X X . . X . X X X X X X X X X X X X X X ", +" X X X . X X . X X X X X . X X . . X X X X X X X X X X X X X X X X X X X X X X X . X X X . X X X ", +" X . X X X X . X X X X X X X X X . X . X X . X . X X X X X X . X X . X . X X X X X X . X X X ", +" X X X X X . X X X X X X X X X X X X X X X . X X X . X X X X . X X X X . X . X X . X X . X X X X X ", +" X ", +" . X ", +" ", +" . . ", +" X . XX X . . . X X . X X X X . X . X . X X . X .. X ", +" . X X X X X X X . X X . X . X X . X . . X X. X . . X ", +" X . . .X X X X . X . . . X . X X X X X X X X X . X X X X . X ", +" . . . X X X . X . . .. . . X X X . . X X X X X . . X . X ", +" X X X . . X X X . X X X X X X . . X X X X X . X X . X X X X X X X ", +" X X .. X X X X X X .X . X X X . . . X X . . . X . . . . X X X . . . ", +" X . X X . X . . . . . X . X X . X X . . . X . . . . X X X . . X . . . X. ", +" XX . . . X . . X X . . . X . . X X X . . . X X X X X X X X . . . . X X X ", +" . X X X X X X X X X X . . X XX X X . X . . X . X X. X X . X . . . X X . X X ", +" . X X . X . X . . . . X X . X X . X . . X . . X . X . . ", +" X. X . . X X X . X . . X X . . X X X X . X . X X . . X X X . . X . . . . X X X X X X X X X ", +" X . . . X X . X . . X . . X X . X X . X X . X . . X X X X X X . X X X X . X . X X ", +" X X X . . X .X . X . . . X . X . . . X . X X .X . X X . . . X X X ", +" X X X X X X . X X . X X . .X X . X X X . X X . . . X . X X . X . . X . X .. . X . X X X . ", +" X . . X . X . . . X . X X X X X X . X X X . . X ", +" . . . . . . . X X X. . X . X . X . . XX X X X . . . . . .X X X ", +" X X X X X X X . X X . . X . X X . . X X X . X X X . X ", +" . X X X . X X X . . X X . X X X X X X . X X ", +" X X . . X X . . X .X X . . X X . X . X X X X X X X X . X . . ", +" . X . X X . X X XX X . . .X X . X X . X X X X .X . X . ", +" . X X X X . X X . X X . . X . X . X . . X X X X X ", +" . X X X . X X X X X X X . X . . X X . X X XX . . X ", +" X . X . X . . . X X X X X . . X . X X . X . X . X X X . . . . X ", +" . X . X X X . . X . . . . X X . X X X X X . X X . X . . . X . X X X X ", +" . . X . X X X X . . X X . . X . . . X . X X . X . X X X X ", +" X X X X X . X X X X . X X . X X X X . X X . X X X X X . X . X ", +" X . . . X . X . . X X . X X . X X . X . X X X X . X . . X . . ", +" . X X X X X . . X . . . X X . X X . . X X . X . X X X . . X X X X X ", +" .. X X X X X . . X X . XX X X . X X . X X . X . . X . . ", +" X X . . . . . X. X .X . X . X . X X . X X . X . . X XX X X X X X ", +" X . X . X . . X X . X X X X X . . X X X X. X X X X X . . . X . . . ", +" X X X X X X . . . . XX X X X X X X X . . X . . X X X X X X X . . . . . . X ", +" X XX . . X X X . . . . X X X . . . X X X X . . X X X X X X X ", +" X . . . . . X. . X X X . X . . X . . . . X . . X . . . . . X X X X X . X ", +" . . X X . XX X X X X . . X . . . X . . X X X ", +" X X X X X . . X X X X X . X X X . X . . X . X . X . . . . . X X ", +" X . X . . X . X X . . . . . . X X X X X . X X X ", +" X . . . XX X X X . . X X . X . . X X . . X X X X X . ", +" X . X . . X . . . X . X . . X X X X X X. . X X . . X X X . X . X ", +" X . . X . . . X . X X X X . X . . . X . X . . . X . X . . . X ", +" X X X X. . . . X X X X . X X . X . X X. . X . X X . X . . X X X X X . . X X ", +" . . X X X X . . . . X X . XX . X . X. . X X X . X X . X ", +" X . X X X X X X X X X . X . X X . X X X X X . X X X X . X . X . . X X . X X X X X X ", +" X . X X X . . X . X . . . X . X X X X X . X . . X .X X X X X X X . X X . . X . . X X X ", +" X X X X X . . . X X X . . X X X X . . X X X . X . . . . . X X . X . ", +" . X. . . X X X . X X . . X . . . . X . X X . X . X . . X . . X X X X X . ", +" X . X X X . X X X X . X X X X X X . X X . X X X X . X .. . X X . . X ", +" X X X X . . . . . . . X X . X X X X . . X . X X X . . X X . . X X X X ", +" X . X . X . . X X X . . . X . . . . . X X . X X . X . X . . X X X . X ", +" X X . X X X X X X X X X X X X X X X X X X X . X XX X . . . X X . ", +" . X . X X . . X X . XX . X X . X X . X . X X . X .. . . X X . . ", +" . . X X . . X . X X . X . . X . X . . X X . X X . . X X . . . . . X X X X . ", +" X X X . X X X X X . X X X X X X X X . X . . . X X X X X .X X . . X X X ", +" . X X X .. X X X X X . X . ", +" X X X X ", +" X ", +" X ", +" X ", +" . ", +" X ", +" X ", +" X . X X X . X X X . X X . X . X X . X X X . X X X X . X X . X X . X X X . X X X X . X X . X X . X X X . X X X . . XX X . X X . X X X . X X X X ", +" . X X X XX . . X X. X XX . . X X. X XX . . X XX XX . . X X . X X ", +" X X X X X X X. . X X. X X X X X X X X . X X. X X X X X X X X . X X X. X X X X X X X X . X X X. X X X X X X X X X X X. ", +" . X X X X X . X X X X . X X X . X . X X X X X X . . X X . X X X X X X . . X X . X X X X X ", +" X X . X . X . X X X . X . X . X X X X . X X X . X . X . X X X X . X X . X . X . X X X X X X X . X . X . X . X . ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" X ", +" X . .X X . . X . X X X X . X ", +" . X X X .X . X X . X . X X X . . ", +" X X X XX . X X X X XX X X X X .X X X . X X X X X ", +" X . X X X X X . . . X . . ", +" X . . X . X X X X X XX . X . X X . X . X X .X . . . X . X ", +" XX X X X X . X . X X X X XX X X X X X . X X X X X XX X ", +" . X X . . . X . X . . X . X . . X X . . ", +" . X . X . . . X X . X . X . X ", +" X . X X . . X X X . X X . . X X X X ", +" X X . X . X . X X . . X . X X X ", +" X X X X X X X X . X ", +" . . X X X X X X . . X . ", +" . . X X X . X X X X X X X . X . X . . X ", +" . X X . . . X X X X X . X . X X ", +" X X X . . X X . X . X . X . . X X X . . ", +" . . . X X X X . X X . X .. X . . X X X ", +" X X . X X X . X X X . X X X X X X X X . X X . X ", +" . X . X . . X X . X . . X X X . X . X ", +" . X . X . X . . . . . X . X . X . X X ", +" X X . . . . . X X X X . . ", +" X . X. X X X . . X . . ", +" . . X X . . X X X X .X . X X X X X X ", +" X X . X X X X . X X X . X X ", +" X X X X X X . X X X X ", +" . X X XX X X X . . X X X X . X . . .X X X . . ", +" X X . X X X X X X . ", +" X . X X . X X X X . . X X X . X X X . X X X X ", +" X X . X X X . . X . . . X X X X X ", +" . X X . . X X X X . . X X . . X ", +" X X . . X X . . X X . X X X X . X X X . X X . ", +" X . X X. X X X X . . X ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" .X X X. XX X X X XX XXX XX X X XX X XXXX XX X XX X X XX X XX X XX XXX ", +" X X X ", +" OX 1qqqqqqqqqqqqqqqqwqqqqq9t4X ,qqqqqqqqqqqqqqqqqqqqqeqe9qqqqqqqqqqqqqqqqqqqqq0qw1X >aBa> %1aBBw<+ BBBBBBBBB> BBBBB4# BBB% %BBB BBB% * ", +" X. 4BBBBBBBBBBBBBBBBBBBBBBBBx;. 9BBBBBBBBBBBBBBBBBBBBBBBaeBBBBBBBBBBBBBBBBBBBBBBBBd 4BBBBB4 O1BBBBBBBB> BBBBBBBBB> BBBBBBB# BBB% %BBB BBB% +B+ ", +" 4NMNMNNNNNNNNNNNNNNNNNNmBk$ . 7NvnNNNBNNNNBNNNNNNNNmBa 5BmNNNNNNNNBNMNNBNNNNNMnBp X >BBBBBBB> owBBBBBBBBBB% BBBBBBBBB> BBBBBBB4 BBB% %BBB BBB% >B< ", +" X 3BMMBBBBBBNBNBBBNBBNBBNNBl& . 7BmNBNBBBBBBBNBBBBNBNBuo 8BNBBBBNBBBBBBBBBBBNBBNMBp aBB7%4BBa BBa 7BB4 7BB4 BBB% +wBBBBBBBBBB% BBBBBBBBB> BBBBBBBBBB+ 4BBBBBBBB4 BBBBBBBBB> :BBB77777BBB> ", +" .X 4BmMmNBBNBNBNBNBNBBNBBBMBz& X 8BMNNNNBMcByoX.X X 6BNBNBBNBNBNBBBNBBNNBBNNBa 1BBBBB4 o4BBBBBBBB< BBBBBBBBB> BBBBBBBBB% o7BBBBBB4o BBBBBBBBB> aBB> :BBB ", +" 4NmNNNNNNBNBNBNNBNBNBBBNBz& . 8BmBNBBNMBy. .X.X X X 7BNBNBNBNBNBBNBBNBBBNBNNBa X >aBa> %1BBBa1+ BBBBBBBBB> BBBBBBB1+ ;qBBw; BBBBBBBBB>;BBB+ oBBB; ", +" X 4BNmNBNmNBBBNBBNBNBNNNNmBz% X. 8BMNBNNMNy. XXX 7BNBNNBBBNBNBBNNBNBNBBNMBa +%%# #%%# ", +" X.. 2BmNNBNNBBNBNBBNBBNBBNmNBk& X 7BmBnnnBy. . X 7BNBBNBNBBNBBNBBNNBBNBNNBa X ", +" XX 4BmNNNNNBNNBNBBNBNNBBNBmBz& X 8BMNMbByoo. 7BNNBBNBNBNNNBNNBBNBNBNNBa ", +" X 2BNMMNNNBNBBBBBBBBBBBBBNBz& X 8BmBnByo o X 7BNBBNBNBNBBNNBNBNBBNBNNBa ", +" 4BbnNNMNBNBBNNNBNNNNBNNNBz& .X 8BmNNy. XoXX X 7BNBNBNBBBNNBBNBNNBNBBNMBa X ", +" XX 4BNMBBNNBNNBNBNBNBNNBNnNBk% X 7BnBt. . X 7BNBNBNBNBNBBNBBNBNNNNBNBa ", +" oo 4BmMNNBNBBNBNBBBNBNBBBNnBk% X 6NNyO X X 7BNBBNBNBNBNBBNBBNBBNBNNBa ", +" X. 9BNNmNNBNBNBNBNNNBBBNBBNBl& X 5Bu. o . X X 7BNBNBNBNNBNBBNNNNNNBBBNBa X ", +" qBmMNNMNBNNBBNBBBNNNBBNNBl* . qd. ..X. 5BNBBNBNBBNBBNNBNBNBNBNNBs ", +" 9BMNNNNMBNBNBNBBBBNBBNNmBk% X -O X X X aBNNBNBBBNBNBNNNNNNMBBMnBw ", +" Xoo 8BvNNBNBBBBNBBNNNBBBNNmmBk% X X .tBBBBNBNNBBNBNNNNNNMNMNmBa+ ", +" .o qBmBmMNBNBBBNBBNBNBNNBBNBz& X X XtBMNBNBNBBBBBBNNNNNNNMNmBsX X %1aBBa<# ;BBB OBBB; BBB% %1aBBa1# BBB% %BBB BBB% BBBBBBBBB> BBBBBB4% ", +" . qBmmNMNNBNNNNBNBBNBBBBBNBz% X XeBMmBNBNBNNBNNNBNNNNBMNnBao oX oBBa BBB% o BBBBBBBB; ", +" 0BnMMMMmBBNBBBNNBNBBBNNMBz& .X X XeBmMmBNBNNBBNNBNNNNNNBmMBao .X OwBBBBBBBBBBq >BBw aBB: BBB% eBBBBBBBBBB> BBB% %BBB BBB% BBBBBBBBB> BBBBBBBBB% ", +" XX. 9BnNBNBBBBBNBNBNBNBNNNnmBk& . XtBNNBBNBNBBBNBBNNNNMMNMnBdo %%:BB1 BBB% %BBB BBB% BBB:%%%%%+ BBB:%*BBB4 ", +" oo qBmNmNBNBBNNBNBNBNBNNBBmBz& XtBmBBNBBBBNBNBNBBNBNNMNNBao X %BBB1 o7BBB# 1BB1 7BB< BBB%+BBBw+ O1 BBB% %BBB BBB% BBB% BBB% *BBB ", +" o 9BmmNNNBBBNBNBBNBBBNBBBMBz& X X XX XeBmNBNBNNBNBNBBNNBNNNMNnBao .X 1BBa +aBB< #BBB+ #BBB+ BBB%>BBB# BBB% %BBB BBB% BBB% BBB% %BBB ", +" qBmmmNMMBNBBNNBBNBNNBBBNBk& . rBmmmBBNBBBBNBNNNNNBNBMnBao o. aBB; :BBw 7BB< 1BB4 BBB%8BB1 BBB% %BBB BBB% BBB% BBB% ;BBB ", +" XX 9BmNNBNNBBNBBNBNBBBBNBmMBj% X o eBNBNBNBBNBNBBNNNNNMNBMnBaO X BBB% %BBB *BBB#BBB% BBB%BBB= BBBBBBBB BBB% %BBB BBB% BBBBBBBB BBB:%;BBB4 ", +" OX 9BmMMBNNBNBBNBNBNBBNBNNnBh+ X tBNNBBBBNBNBNNBNNNNMNmNMBao BBB% ;1 %BBB aBBwBBw BBB%BBB% BBBBBBBB BBB% %BBB BBB% BBBBBBBB BBBBBBBBB# ", +" oo 9BnNMNNBNBNBNBNBBNNBBNBNBgo X X XtBnBBNNBNBNBNBBNNNNNNMNmBd. o aBB; =BB1:BBa ;BBBBB; BBB%BBB* BBBBBBBB BBB% %BBB BBB% BBBBBBBB BBBBBBBB; ", +" qBmmmNMNBNBNNBNBNBNBBBBNBgo + XeBmnNBBBBBNBNBNNNNNNNNNmBao oo 1BBa eBBBBBB1 OBBBBa BBB%4BB4 %%%%7BB4 BBB% *BBB BBB% BBB:%%%% BBB1BBB+ ", +" X qBMMNNNNNNBNBBBBNBBBNBNmBg+ X X .rBmNMBBNBNNBBBNBNNNMNNNnBao XX &BBB1 owBBBBB% BBB%;BBB: ;BBB; 7BB4 8BB4 BBB% BBB% BBB%aBB> ", +" XoX 9BbNNBBBNBBNNBBNBBNBNBMvBf+ X. XtBNBBBBBBBBBBNBNNNNMNNNmBao 1BBBa;%%>BBBBw +BBBo BBB% 7BBB7=%%*8BBB7 ;BBB4%%4BBB* BBB% BBB:%%%%&+ BBB%*BBB+ ", +" .o qBmNmNNNNBNNBBNNNNNBNBBNBfO .tBMBNBNBNNNNNNNBNBBNNMMmBdX X oqBBBBBBBBBBBB1 1B1 BBB& owBBBBBBBBBBeo 4BBBBBBBB4 BBB% BBBBBBBBB> BBB% 7BB7 ", +" X qBmmNNNBBNBBBBBNBBNBNBNNBg+.. eBMMBNNBBBBBNNBBBBNNBmNbBao oX O1BBBBBBBBBBB; %B+ BBB% o1BBBBBBBB1o o8BBBBBB4+ BBB% BBBBBBBBB> BBB% %BBB; ", +" qBmmMMNMBNNBNNBNBNNBNBBNBgO .. X rBmMmBBBBNNBNBBNNBNNBBMNBao X. %1BBBa1%Oq; > BBB% %1BBBB1% ;wBBq= BBB% BBBBBBBBB> BBB% 4BBBO ", +" XX 9BnNNBNBNBNBNBBNBBBBNBmmBg+ o rBNNBBNBNBNBNNNNNNNMNNNnBdo ", +" o. 0BnNMNBNBNNNNBBNBNNBNBBmBg+ X otBMNBBBNNBNBBBBNNNNNNMNNBio X ", +" . 0BmNmNMNBBNBBBNNBBBBBBNNBgoX X tBmNBNNNBNNNBNBNNNNNNNNmBao oX ", +" wBnMmNMNBNNBNBNBNBNBNBBMBg+ + rBmnNBNBBNBBBNBNNNNNNNMnBaO oo ", +" XX. 9BMNNBNNNBNNBBNBNNBBNBNvBh+ X X.X o rBNNNBBBNBNBNBNBNNNNNBNvBao X XX ", +" .X 9NnNMBNBNBBNBNBBNBBBNBNMBg@ . . X X XX eBNBBBBNNBNBNBNBNBBNBNBNBpo oX. ", +" .XqBmNMNNBNNBBBNBBNBBNBBNNNfO oeBmNBBNNBNBBBNBNBBNNBBBNBdX o XO ", +" X :BmmMNMBNBNBNNBNNBBNBNNBBMftgsssddddddssssssssddsssdsssssssssssdssdddsdssaft+ 2BmNBNNBBNBNBNBNBNBBBBNNBjo o. X +< ", +" X :BmNNNMBNBNBBNBNBNBNBNBNNNNBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBv# 9BNNNBBNBNBNNBBBNBNBNBNMBy .X .yd ", +" ;BMBBNNNBNBNNBNBBNBBNBNBBBBNNBBNNNBNBNNNBNNNBNNBNNNNNNBNNNBNNNNBBNNNBNNNNMBx@ X 7BmNBNNBBBNBBNNBBNBNNBBNBi X X.O.owBi X ", +" X ;BMNNBNNNBNBBNBBNBNBBNNBNNNNBNNNBBNNNBBBNNBNBNBNNBNNBBNBBBNNBNBNBBBNNBBNBmBx# 7BmNNNNBNBBNNNBNBNBNBNNNBu .. wBNu o ", +" :BNNBNBBNBBNBBBNBNBNNBNBBNBNBNBBNBBNBNBNBBBBBNBBBBBBNBBNBNBNBBNBBNBNBBNBBMBx# X 7BmBBBBNBNBNBBNBNBNBBNBNBp X .. tBbBa 4 %BBB BBBBBBBBBBB BBBBBB4% * BBB% &BBB 4BBBo +BBB> ", +"X X ;BNNBNBNBNBNBNBNBBNBBNBBNBNBBNBNBNBBNBBNNBNBNBBNBNBNBBNNBNNBNNBNBBBBNBBNBNBx# 8BMNNNBBNBNBNBNBBBNBBNBNBu X o.eBMMBp X B1 %BBB BBBBBBBBBBB BBBBBBBB; oB+ BBB% %BBB +BBB> 1BBao ", +" :BNNNBNBBBBNNBNBNNBNNBNBBNBBNBNBBBNBBNNBBNBNNBNBNBNBNNBBNBBNBBNBNNBBBNBNBNBx@ X 8BMBBNBNBNBNBNBBNBBNBNNNBu X....eNcMMBa BB1 %BBB BBBBBBBBBBB BBBBBBBBB% >B< BBB% %BBB >BBBO #BBB; ", +" X ;BMNBNNBNBNBNBBNNBNBBNBNBBNBBNNBNBBNBBNNNBBNBNNBNBBNNBNBBNNBBBBNNBBNNBBBBNBx# 8BMNBNNBBBBNNBBNBNNBBBBNBp X .oo eNnMNNBa BBB1 %BBB %%%:BBB%%%% BBB:%*BBB4 +BBBo BBB% %BBB oBBB< 8BBa ", +" :BNNNBBNBNBNBNBBBNBBNBNBNNBNNBBNBNNBNNBNBNBBNBBNBNBBBNBNBBBNBNBBBNBBNBNBBNBx@ X X 8BMNBNBNNBNBNBNBNBBNNBBNBu X . eBnMnMMBa X BBBB1 %BBB %BBB BBB% *BBB ;BBB: BBB% %BBB >BBB;BBB; ", +" X :BNNNNBNNBBNBNBNBNBBBNBNBBBNBNBNBNBNBBBNBBNBBNBBNBNBBNBNBNBNNBNNBNBNBNBNBMBx# X 8BmBBNBBNBBNBBNBBBNBNBBNBu . eBMMMNMNBa BBBBB1 %BBB %BBB BBB% %BBB aBBBa BBB% %BBB OBBBBBB8 ", +" X :BNNNBNBBNNBNBNBNBBNNBNBBNBNNBBBNBNBBNNBBNBNNBBNBNBNNBNBBNNBBNBBNBNBNBNBBNBx# X 8BMNNBNBBNNBNBBNNBBNBNNNBp X X X...eBnNNNNBMBs X BBBBBB1 %BBB %BBB BBB% ;BBB *BBBBB; BBB% &BBB ;BBBBB% ", +"X ;BNNBNBBNBNBBBNBNBNBNNBBNBNBNBNBNBBBNBBNNBNNBNBBBBNBBNBBNBBNBBNBBNNBNBBNBNBx# 8BMBNNBNNBBNBNNBBNBBBNBNNp X X Xo..eNnnNNNNNNBa BBB4BBB1%BBB %BBB BBB:%;BBB4 8BBBBBw BBBBBBBBBBB aBBB8 ", +" X :BNNNBNBBNBNBNBNBNBNBBNNBNBNBNBNBNNNBNNBBNBBNBNNBNBNBBBNBNNBBNBNBBBNBNNBBNBx# 8BMNBNBBBNNBNBBNNBNNNBNNBp X o qBnMnBBNBNMBa BBB%1BBBwBBB %BBB BBBBBBBBB# #BBB*BBB% BBBBBBBBBBB ;BBB# ", +" ;BNNNNBBNBNBNBNBBBNBBNBNBNBNBBBNBNBNNBNBNBBNNBBNBNBNBNBNBBBNNBNBBNBNBBBNBNBx# X 8BmNBNBNNBNBBNBNBNNBNBNNBi X ...rBnMnMNNBNBNBa X BBB% 1BBBBBB %BBB BBBBBBBB; 1BB7 8BB4 BBBBBBBBBBB %BBB ", +" X :BNNBBNNBNNBBBBNNBBBNBNBBBNBNBNBNBNBBNNBBNNBBNNBNBBNNBNBNNNBBNBNNBNBNBNBBNBx# 8BMBNBNBBNBNNBBNNBBNBBBNBi X . .eBmNNNNNBNBNMBa BBB% 1BBBBB %BBB BBB1BBB+ +BBB; *BBB+ BBB:%%%:BBB %BBB ", +" ;BMNBNBNNBBNBNNNBNNBBNNBNBBNNBBBNBBNBBBNBBBBNBBBBBNBNBBNNBBNNBNBBNBNBNBNBMBx# 8BMNBNBNBNNBBBNBBBNBNBBMBi X Xoo.eBcmBBNNBNNNNNBs BBB% 1BBBB %BBB BBB%aBB> BBB% %BBB %BBB ", +" ;BmNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNNNBNNNNNNNNNBNBNBBNBNBNBBBNBBNBBBBNBx# X 8BmNNBNBBNNBBBNBBBNNNBNNBp o.wBNNMNNBNBBBNBNBMBa BBB% 1B %BBB BBB% %BBB; aBB> :BBB BBB% %BBB %BBB ", +" X X :BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBNBNNBNBNNBBNBNNBBNNNBMBx# X 8BNBNNNBNBBNNBBNNBNBBBBNBp ..oXwNcNBNNBNNBNBNNBNNBa . BBB% 4 %BBB BBB% 4BBBo;BBBo +BBB; BBB% %BBB %BBB ", +" *fsssssdddssssssdddssssssdsdddssssssssssddssdsssdshBNBNNBBNBNBNBNBBNBBBBBNBx# 8BmNBNBBBNNBBNBNBNNBNNBNBa o. eBnnNNNBNBBNBNBNBNNBa o +%%# #%%# ", +" X X =NNBNNBNBNBNBNNBNBNBNNBMBx# X 8BmBBNNNNNNNNNNNNNNNNBBNBu .XeBnnbNNNNNNNNNNNNNNNBa ", +" XXX X -BMBNNBNBBNBNBBNBNBBNBBNBx# 8BmNNNNNBNBNNNBNBNNNNBBNBa XeBnMnMNNNNBNBNNNBNBNNBa X ", +" X X X X X -BNBNNBBNBNBBBNBBNBNBNBNBx# 7NmmMMMMMMMMMMNMMMNNMMMmNy rMcMMMMMMMNMMMMNMNmmNmMp ", +" X X X -BBNBNBNBNBNBNBNNBNBBNBNBx# 0BBBBBBBBBBBBBBBBBBBBBBBBheBBBBBNBBBBBBBBBBBBBBBBBf ", +" -BNNBNBNNBBNNBNBBNBBBBBNBx# X :5444444444444444444444442544544444444444444444444< ", +" =BNBNBNBBNBBBNBBNBNBNNBNBx# . ", +" =BNBBBNBNBBNNBBNBNBBBNBmBx# XXXX X.XXXX X X XX XXX XX..X XXX .X . X. .X.o ", +" =BNNBNBNBNNBNBNBBBNBNBBNBx# X ", +" =BNBNBNBNNBNNBBNNBNBBNBNBx# ", +" X -BNNBBBNBBNBBNNBBNBNBBBNBx# ", +" =BNBBNBNNBBNNBBNBNNBBNBmBx# %1aBBa1# BBBBB4# BBBBBB4% %1aBBa1% %1aBBw<+ BBB% %BBB * BBBBBB4% ", +" X =BNBNBNBBNBBBNBBNBNBNBBNBx# + BBB% %BBB +B+ BBBBBBBB; ", +" X =BNNBNNBNBNBNBNBBNBNBNBNBx# qBBBBBBBBBB> BBBBBBB4 BBBBBBBBB% OqBBBBBBBBBBwo OqBBBBBBBBBB& BBB% %BBB >B< BBBBBBBBB% ", +" =BNBNBBNBNBBBNNBBNNBBNBMBx# %%:BB1 BBB:;BBB BBB:%=BBB4 BBB# BBBBBBBa* BBB% %BBB 1BBa+ oaBB1 1BBao BBB% %BBB aBBBa BBB% %BBB ", +" X =BNNBBNBNBNBBBNBBNBNBNBNBx# 8BB1 BBBBBBBBB< BBB% =BBB aBB: :BBa aBB: BBB% %BBB *BBBBB; BBB% ;BBB ", +" =BNBNNBNBNBNBNBNNBNBNBBMBx# BBB* BBBBBBBB BBBBBBBBBB% BBB:%;BBB4 BBB% %BBB BBB% BBBBBBBBBBB 8BBBBBw BBB:%=BBB4 ", +" X -BNNBNNBBNBBBNNBNBNBBNBNBx# BBB% BBBBBBBB BBB% o7BB4 BBBBBBBBB# BBB% %BBB BBB% BBBBBBBBBBB #BBB*BBB% BBBBBBBBB# ", +" -BNBNBBBNBNBNBNBBNBBBBBNBx# BBB* BBBBBBBB BBB% *BBB BBBBBBBB; aBB: :BBB aBB: BBBBBBBBBBB 1BB7 7BB4 BBBBBBBB; ", +" -BNBBBNNNNBNNBBBNBBNBBBNBx# 4BB4 %%%%7BB4 BBB% &BBB BBB1BBB+ 1BBao osBB1 1BBa BBB:%%%:BBB +BBB; *BBB+ BBB1BBB+ ", +" X -BNNNBNBBNNBBBNNBNBNNNBMBx# =BBB: ;BBB; BBB% >BBa BBB%aBB> %BBB1O O1BBB% &BBB1 O* BBB& %BBB ", +" =NMNNNNNNNNNNNNNNNNNNMNmBx# 8BBB8;%%*7BBB7 BBB:%%:BBB1 BBB%*BBB+ 1BBBa;%%:aBBB4 1BBBw;%%;aB; BBB% %BBB oBBBBBBBBBBBO BBB%*BBB+ ", +" ;BBBBBBBBBBBBBBBBBBBBBBBBm# oqBBBBBBBBBBwo BBBBBBBBBB+ BBB% 7BB8 +qBBBBBBBBBBwo owBBBBBBBBBB% BBB% %BBB :BBB77778BBB> BBB% 8BB7 ", +" %qqqqqqqqqqqqqqqqqqqqqqqq7+ o1BBBBBBBB1+ BBBBBBBBB% BBB% %BBB; O1BBBBBBBB1+ O4BBBBBBBB< BBB% %BBB aBB> :BBB BBB% %BBB= ", +" %1BBBB1% BBBBBBB1+ BBB% 4BBBo %1BBBB1% %1BBBa1+ BBB& %BBB ;BBB+ oBBB; BBB% 4BBB+ ", +" XXXXXXXX.XXXX.XXX..XX.oo.X +%%# %%%# ", +" . ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" " +}; diff --git a/xpm/plainBG.XPM b/xpm/plainBG.XPM new file mode 100644 index 0000000..f7da483 --- /dev/null +++ b/xpm/plainBG.XPM @@ -0,0 +1,703 @@ +/* XPM */ +static char *_484132463627[] = { +/* columns rows colors chars-per-pixel */ +"1000 640 57 1 ", +" c #000000", +". c #090906", +"X c #070709", +"o c #0D0D0C", +"O c #11110E", +"+ c #151515", +"@ c #191917", +"# c #1C1C1C", +"$ c #21211F", +"% c #262626", +"& c #292926", +"* c #2E2E2E", +"= c #373735", +"- c #383836", +"; c #393939", +": c #424242", +"> c gray30", +", c #565655", +"< c #585858", +"1 c #656565", +"2 c #6E6E6E", +"3 c #71726F", +"4 c #747473", +"5 c #7B7B7A", +"6 c #81817F", +"7 c #848483", +"8 c #888886", +"9 c #8D8D8C", +"0 c #91918E", +"q c #959594", +"w c #999996", +"e c #9D9D9B", +"r c #A1A19F", +"t c #A3A4A2", +"y c #A9AAA6", +"u c #AEAEAC", +"i c #AFB0AB", +"p c #B1B1AF", +"a c #B3B3B2", +"s c #B9B9B6", +"d c #BABABA", +"f c #C1C2BE", +"g c #C4C4C4", +"h c #C8C8C6", +"j c #CDCDCB", +"k c #D6D6D4", +"l c #D9D9D7", +"z c #DBDBDA", +"x c #E5E5E3", +"c c #EAEBE6", +"v c #EEEEEB", +"b c #EFF0EA", +"n c #F2F3EE", +"m c #F5F6F2", +"M c #F7F8F3", +"N c #FBFCF6", +"B c #FEFFFB", +/* pixels */ +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" . . . . . . . . X . . X X X X X X . X X . . X X X X X . X X . X . . . . X ", +" X X X X X X X X X X X X X . X X X X X X X X X X X X X X . . X X X X . . X . X X X X X . . X X X X . . X X X X . X X X . . X X X X . . X . X X X X X X X X X X X X X X ", +" X X X . X X . X X X X X . X X . . X X X X X X X X X X X X X X X X X X X X X X X . X X X . X X X ", +" X . X X X X . X X X X X X X X X . X . X X . X . X X X X X X . X X . X . X X X X X X . X X X ", +" X X X X X . X X X X X X X X X X X X X X X . X X X . X X X X . X X X X . X . X X . X X . X X X X X ", +" X ", +" . X ", +" ", +" . . ", +" X . XX X . . . X X . X X X X . X . X . X X . X .. X ", +" . X X X X X X X . X X . X . X X . X . . X X. X . . X ", +" X . . .X X X X . X . . . X . X X X X X X X X X . X X X X . X ", +" . . . X X X . X . . .. . . X X X . . X X X X X . . X . X ", +" X X X . . X X X . X X X X X X . . X X X X X . X X . X X X X X X X ", +" X X .. X X X X X X .X . X X X . . . X X . . . X . . . . X X X . . . ", +" X . X X . X . . . . . X . X X . X X . . . X . . . . X X X . . X . . . X. ", +" XX . . . X . . X X . . . X . . X X X . . . X X X X X X X X . . . . X X X ", +" . X X X X X X X X X X . . X XX X X . X . . X . X X. X X . X . . . X X . X X ", +" . X X . X . X . . . . X X . X X . X . . X . . X . X . . ", +" X. X . . X X X . X . . X X . . X X X X . X . X X . . X X X . . X . . . . X X X X X X X X X ", +" X . . . X X . X . . X . . X X . X X . X X . X . . X X X X X X . X X X X . X . X X ", +" X X X . . X .X . X . . . X . X . . . X . X X .X . X X . . . X X X ", +" X X X X X X . X X . X X . .X X . X X X . X X . . . X . X X . X . . X . X .. . X . X X X . ", +" X . . X . X . . . X . X X X X X X . X X X . . X ", +" . . . . . . . X X X. . X . X . X . . XX X X X . . . . . .X X X ", +" X X X X X X X . X X . . X . X X . . X X X . X X X . X ", +" . X X X . X X X . . X X . X X X X X X . X X ", +" X X . . X X . . X .X X . . X X . X . X X X X X X X X . X . . ", +" . X . X X . X X XX X . . .X X . X X . X X X X .X . X . ", +" . X X X X . X X . X X . . X . X . X . . X X X X X ", +" . X X X . X X X X X X X . X . . X X . X X XX . . X ", +" X . X . X . . . X X X X X . . X . X X . X . X . X X X . . . . X ", +" . X . X X X . . X . . . . X X . X X X X X . X X . X . . . X . X X X X ", +" . . X . X X X X . . X X . . X . . . X . X X . X . X X X X ", +" X X X X X . X X X X . X X . X X X X . X X . X X X X X . X . X ", +" X . . . X . X . . X X . X X . X X . X . X X X X . X . . X . . ", +" . X X X X X . . X . . . X X . X X . . X X . X . X X X . . X X X X X ", +" .. X X X X X . . X X . XX X X . X X . X X . X . . X . . ", +" X X . . . . . X. X .X . X . X . X X . X X . X . . X XX X X X X X ", +" X . X . X . . X X . X X X X X . . X X X X. X X X X X . . . X . . . ", +" X X X X X X . . . . XX X X X X X X X . . X . . X X X X X X X . . . . . . X ", +" X XX . . X X X . . . . X X X . . . X X X X . . X X X X X X X ", +" X . . . . . X. . X X X . X . . X . . . . X . . X . . . . . X X X X X . X ", +" . . X X . XX X X X X . . X . . . X . . X X X ", +" X X X X X . . X X X X X . X X X . X . . X . X . X . . . . . X X ", +" X . X . . X . X X . . . . . . X X X X X . X X X ", +" X . . . XX X X X . . X X . X . . X X . . X X X X X . ", +" X . X . . X . . . X . X . . X X X X X X. . X X . . X X X . X . X ", +" X . . X . . . X . X X X X . X . . . X . X . . . X . X . . . X ", +" X X X X. . . . X X X X . X X . X . X X. . X . X X . X . . X X X X X . . X X ", +" . . X X X X . . . . X X . XX . X . X. . X X X . X X . X ", +" X . X X X X X X X X X . X . X X . X X X X X . X X X X . X . X . . X X . X X X X X X ", +" X . X X X . . X . X . . . X . X X X X X . X . . X .X X X X X X X . X X . . X . . X X X ", +" X X X X X . . . X X X . . X X X X . . X X X . X . . . . . X X . X . ", +" . X. . . X X X . X X . . X . . . . X . X X . X . X . . X . . X X X X X . ", +" X . X X X . X X X X . X X X X X X . X X . X X X X . X .. . X X . . X ", +" X X X X . . . . . . . X X . X X X X . . X . X X X . . X X . . X X X X ", +" X . X . X . . X X X . . . X . . . . . X X . X X . X . X . . X X X . X ", +" X X . X X X X X X X X X X X X X X X X X X X . X XX X . . . X X . ", +" . X . X X . . X X . XX . X X . X X . X . X X . X .. . . X X . . ", +" . . X X . . X . X X . X . . X . X . . X X . X X . . X X . . . . . X X X X . ", +" X X X . X X X X X . X X X X X X X X . X . . . X X X X X .X X . . X X X ", +" . X X X .. X X X X X . X . ", +" X X X X ", +" X ", +" X ", +" X ", +" . ", +" X ", +" X ", +" X . X X X . X X X . X X . X . X X . X X X . X X X X . X X . X X . X X X . X X X X . X X . X X . X X X . X X X . . XX X . X X . X X X . X X X X ", +" . X X X XX . . X X. X XX . . X X. X XX . . X XX XX . . X X . X X ", +" X X X X X X X. . X X. X X X X X X X X . X X. X X X X X X X X . X X X. X X X X X X X X . X X X. X X X X X X X X X X X. ", +" . X X X X X . X X X X . X X X . X . X X X X X X . . X X . X X X X X X . . X X . X X X X X ", +" X X . X . X . X X X . X . X . X X X X . X X X . X . X . X X X X . X X . X . X . X X X X X X X . X . X . X . X . ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" X ", +" X . .X X . . X . X X X X . X ", +" . X X X .X . X X . X . X X X . . ", +" X X X XX . X X X X XX X X X X .X X X . X X X X X ", +" X . X X X X X . . . X . . ", +" X . . X . X X X X X XX . X . X X . X . X X .X . . . X . X ", +" XX X X X X . X . X X X X XX X X X X X . X X X X X XX X ", +" . X X . . . X . X . . X . X . . X X . . ", +" . X . X . . . X X . X . X . X ", +" X . X X . . X X X . X X . . X X X X ", +" X X . X . X . X X . . X . X X X ", +" X X X X X X X X . X ", +" . . X X X X X X . . X . ", +" . . X X X . X X X X X X X . X . X . . X ", +" . X X . . . X X X X X . X . X X ", +" X X X . . X X . X . X . X . . X X X . . ", +" . . . X X X X . X X . X .. X . . X X X ", +" X X . X X X . X X X . X X X X X X X X . X X . X ", +" . X . X . . X X . X . . X X X . X . X ", +" . X . X . X . . . . . X . X . X . X X ", +" X X . . . . . X X X X . . ", +" X . X. X X X . . X . . ", +" . . X X . . X X X X .X . X X X X X X ", +" X X . X X X X . X X X . X X ", +" X X X X X X . X X X X ", +" . X X XX X X X . . X X X X . X . . .X X X . . ", +" X X . X X X X X X . ", +" X . X X . X X X X . . X X X . X X X . X X X X ", +" X X . X X X . . X . . . X X X X X ", +" . X X . . X X X X . . X X . . X ", +" X X . . X X . . X X . X X X X . X X X . X X . ", +" X . X X. X X X X . . X ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" .X X X. XX X X X XX XXX XX X X XX X XXXX XX X XX X X XX X XX X XX XXX ", +" X X X ", +" OX 1qqqqqqqqqqqqqqqqwqqqqq9t4X ,qqqqqqqqqqqqqqqqqqqqqeqe9qqqqqqqqqqqqqqqqqqqqq0qw1X >aBa> %1aBBw<+ BBBBBBBBB> BBBBB4# BBB% %BBB BBB% * ", +" X. 4BBBBBBBBBBBBBBBBBBBBBBBBx;. 9BBBBBBBBBBBBBBBBBBBBBBBaeBBBBBBBBBBBBBBBBBBBBBBBBd 4BBBBB4 O1BBBBBBBB> BBBBBBBBB> BBBBBBB# BBB% %BBB BBB% +B+ ", +" 4NMNMNNNNNNNNNNNNNNNNNNmBk$ . 7NvnNNNBNNNNBNNNNNNNNmBa 5BmNNNNNNNNBNMNNBNNNNNMnBp X >BBBBBBB> owBBBBBBBBBB% BBBBBBBBB> BBBBBBB4 BBB% %BBB BBB% >B< ", +" X 3BMMBBBBBBNBNBBBNBBNBBNNBl& . 7BmNBNBBBBBBBNBBBBNBNBuo 8BNBBBBNBBBBBBBBBBBNBBNMBp aBB7%4BBa BBa 7BB4 7BB4 BBB% +wBBBBBBBBBB% BBBBBBBBB> BBBBBBBBBB+ 4BBBBBBBB4 BBBBBBBBB> :BBB77777BBB> ", +" .X 4BmMmNBBNBNBNBNBNBBNBBBMBz& X 8BMNNNNBMcByoX.X X 6BNBNBBNBNBNBBBNBBNNBBNNBa 1BBBBB4 o4BBBBBBBB< BBBBBBBBB> BBBBBBBBB% o7BBBBBB4o BBBBBBBBB> aBB> :BBB ", +" 4NmNNNNNNBNBNBNNBNBNBBBNBz& . 8BmBNBBNMBy. .X.X X X 7BNBNBNBNBNBBNBBNBBBNBNNBa X >aBa> %1BBBa1+ BBBBBBBBB> BBBBBBB1+ ;qBBw; BBBBBBBBB>;BBB+ oBBB; ", +" X 4BNmNBNmNBBBNBBNBNBNNNNmBz% X. 8BMNBNNMNy. XXX 7BNBNNBBBNBNBBNNBNBNBBNMBa +%%# #%%# ", +" X.. 2BmNNBNNBBNBNBBNBBNBBNmNBk& X 7BmBnnnBy. . X 7BNBBNBNBBNBBNBBNNBBNBNNBa X ", +" XX 4BmNNNNNBNNBNBBNBNNBBNBmBz& X 8BMNMbByoo. 7BNNBBNBNBNNNBNNBBNBNBNNBa ", +" X 2BNMMNNNBNBBBBBBBBBBBBBNBz& X 8BmBnByo o X 7BNBBNBNBNBBNNBNBNBBNBNNBa ", +" 4BbnNNMNBNBBNNNBNNNNBNNNBz& .X 8BmNNy. XoXX X 7BNBNBNBBBNNBBNBNNBNBBNMBa X ", +" XX 4BNMBBNNBNNBNBNBNBNNBNnNBk% X 7BnBt. . X 7BNBNBNBNBNBBNBBNBNNNNBNBa ", +" oo 4BmMNNBNBBNBNBBBNBNBBBNnBk% X 6NNyO X X 7BNBBNBNBNBNBBNBBNBBNBNNBa ", +" X. 9BNNmNNBNBNBNBNNNBBBNBBNBl& X 5Bu. o . X X 7BNBNBNBNNBNBBNNNNNNBBBNBa X ", +" qBmMNNMNBNNBBNBBBNNNBBNNBl* . qd. ..X. 5BNBBNBNBBNBBNNBNBNBNBNNBs ", +" 9BMNNNNMBNBNBNBBBBNBBNNmBk% X -O X X X aBNNBNBBBNBNBNNNNNNMBBMnBw ", +" Xoo 8BvNNBNBBBBNBBNNNBBBNNmmBk% X X .tBBBBNBNNBBNBNNNNNNMNMNmBa+ ", +" .o qBmBmMNBNBBBNBBNBNBNNBBNBz& X X XtBMNBNBNBBBBBBNNNNNNNMNmBsX X %1aBBa<# ;BBB OBBB; BBB% %1aBBa1# BBB% %BBB BBB% BBBBBBBBB> BBBBBB4% ", +" . qBmmNMNNBNNNNBNBBNBBBBBNBz% X XeBMmBNBNBNNBNNNBNNNNBMNnBao oX oBBa BBB% o BBBBBBBB; ", +" 0BnMMMMmBBNBBBNNBNBBBNNMBz& .X X XeBmMmBNBNNBBNNBNNNNNNBmMBao .X OwBBBBBBBBBBq >BBw aBB: BBB% eBBBBBBBBBB> BBB% %BBB BBB% BBBBBBBBB> BBBBBBBBB% ", +" XX. 9BnNBNBBBBBNBNBNBNBNNNnmBk& . XtBNNBBNBNBBBNBBNNNNMMNMnBdo %%:BB1 BBB% %BBB BBB% BBB:%%%%%+ BBB:%*BBB4 ", +" oo qBmNmNBNBBNNBNBNBNBNNBBmBz& XtBmBBNBBBBNBNBNBBNBNNMNNBao X %BBB1 o7BBB# 1BB1 7BB< BBB%+BBBw+ O1 BBB% %BBB BBB% BBB% BBB% *BBB ", +" o 9BmmNNNBBBNBNBBNBBBNBBBMBz& X X XX XeBmNBNBNNBNBNBBNNBNNNMNnBao .X 1BBa +aBB< #BBB+ #BBB+ BBB%>BBB# BBB% %BBB BBB% BBB% BBB% %BBB ", +" qBmmmNMMBNBBNNBBNBNNBBBNBk& . rBmmmBBNBBBBNBNNNNNBNBMnBao o. aBB; :BBw 7BB< 1BB4 BBB%8BB1 BBB% %BBB BBB% BBB% BBB% ;BBB ", +" XX 9BmNNBNNBBNBBNBNBBBBNBmMBj% X o eBNBNBNBBNBNBBNNNNNMNBMnBaO X BBB% %BBB *BBB#BBB% BBB%BBB= BBBBBBBB BBB% %BBB BBB% BBBBBBBB BBB:%;BBB4 ", +" OX 9BmMMBNNBNBBNBNBNBBNBNNnBh+ X tBNNBBBBNBNBNNBNNNNMNmNMBao BBB% ;1 %BBB aBBwBBw BBB%BBB% BBBBBBBB BBB% %BBB BBB% BBBBBBBB BBBBBBBBB# ", +" oo 9BnNMNNBNBNBNBNBBNNBBNBNBgo X X XtBnBBNNBNBNBNBBNNNNNNMNmBd. o aBB; =BB1:BBa ;BBBBB; BBB%BBB* BBBBBBBB BBB% %BBB BBB% BBBBBBBB BBBBBBBB; ", +" qBmmmNMNBNBNNBNBNBNBBBBNBgo + XeBmnNBBBBBNBNBNNNNNNNNNmBao oo 1BBa eBBBBBB1 OBBBBa BBB%4BB4 %%%%7BB4 BBB% *BBB BBB% BBB:%%%% BBB1BBB+ ", +" X qBMMNNNNNNBNBBBBNBBBNBNmBg+ X X .rBmNMBBNBNNBBBNBNNNMNNNnBao XX &BBB1 owBBBBB% BBB%;BBB: ;BBB; 7BB4 8BB4 BBB% BBB% BBB%aBB> ", +" XoX 9BbNNBBBNBBNNBBNBBNBNBMvBf+ X. XtBNBBBBBBBBBBNBNNNNMNNNmBao 1BBBa;%%>BBBBw +BBBo BBB% 7BBB7=%%*8BBB7 ;BBB4%%4BBB* BBB% BBB:%%%%&+ BBB%*BBB+ ", +" .o qBmNmNNNNBNNBBNNNNNBNBBNBfO .tBMBNBNBNNNNNNNBNBBNNMMmBdX X oqBBBBBBBBBBBB1 1B1 BBB& owBBBBBBBBBBeo 4BBBBBBBB4 BBB% BBBBBBBBB> BBB% 7BB7 ", +" X qBmmNNNBBNBBBBBNBBNBNBNNBg+.. eBMMBNNBBBBBNNBBBBNNBmNbBao oX O1BBBBBBBBBBB; %B+ BBB% o1BBBBBBBB1o o8BBBBBB4+ BBB% BBBBBBBBB> BBB% %BBB; ", +" qBmmMMNMBNNBNNBNBNNBNBBNBgO .. X rBmMmBBBBNNBNBBNNBNNBBMNBao X. %1BBBa1%Oq; > BBB% %1BBBB1% ;wBBq= BBB% BBBBBBBBB> BBB% 4BBBO ", +" XX 9BnNNBNBNBNBNBBNBBBBNBmmBg+ o rBNNBBNBNBNBNNNNNNNMNNNnBdo ", +" o. 0BnNMNBNBNNNNBBNBNNBNBBmBg+ X otBMNBBBNNBNBBBBNNNNNNMNNBio X ", +" . 0BmNmNMNBBNBBBNNBBBBBBNNBgoX X tBmNBNNNBNNNBNBNNNNNNNNmBao oX ", +" wBnMmNMNBNNBNBNBNBNBNBBMBg+ + rBmnNBNBBNBBBNBNNNNNNNMnBaO oo ", +" XX. 9BMNNBNNNBNNBBNBNNBBNBNvBh+ X X.X o rBNNNBBBNBNBNBNBNNNNNBNvBao X XX ", +" .X 9NnNMBNBNBBNBNBBNBBBNBNMBg@ . . X X XX eBNBBBBNNBNBNBNBNBBNBNBNBpo oX. ", +" .XqBmNMNNBNNBBBNBBNBBNBBNNNfO oeBmNBBNNBNBBBNBNBBNNBBBNBdX o XO ", +" X :BmmMNMBNBNBNNBNNBBNBNNBBMftgsssddddddssssssssddsssdsssssssssssdssdddsdssaft+ 2BmNBNNBBNBNBNBNBNBBBBNNBjo o. X +< ", +" X :BmNNNMBNBNBBNBNBNBNBNBNNNNBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBv# 9BNNNBBNBNBNNBBBNBNBNBNMBy .X .yd ", +" ;BMBBNNNBNBNNBNBBNBBNBNBBBBNNBBNNNBNBNNNBNNNBNNBNNNNNNBNNNBNNNNBBNNNBNNNNMBx@ X 7BmNBNNBBBNBBNNBBNBNNBBNBi X X.O.owBi X ", +" X ;BMNNBNNNBNBBNBBNBNBBNNBNNNNBNNNBBNNNBBBNNBNBNBNNBNNBBNBBBNNBNBNBBBNNBBNBmBx# 7BmNNNNBNBBNNNBNBNBNBNNNBu .. wBNu o ", +" :BNNBNBBNBBNBBBNBNBNNBNBBNBNBNBBNBBNBNBNBBBBBNBBBBBBNBBNBNBNBBNBBNBNBBNBBMBx# X 7BmBBBBNBNBNBBNBNBNBBNBNBp X .. tBbBa 4 %BBB BBBBBBBBBBB BBBBBB4% * BBB% &BBB 4BBBo +BBB> ", +"X X ;BNNBNBNBNBNBNBNBBNBBNBBNBNBBNBNBNBBNBBNNBNBNBBNBNBNBBNNBNNBNNBNBBBBNBBNBNBx# 8BMNNNBBNBNBNBNBBBNBBNBNBu X o.eBMMBp X B1 %BBB BBBBBBBBBBB BBBBBBBB; oB+ BBB% %BBB +BBB> 1BBao ", +" :BNNNBNBBBBNNBNBNNBNNBNBBNBBNBNBBBNBBNNBBNBNNBNBNBNBNNBBNBBNBBNBNNBBBNBNBNBx@ X 8BMBBNBNBNBNBNBBNBBNBNNNBu X....eNcMMBa BB1 %BBB BBBBBBBBBBB BBBBBBBBB% >B< BBB% %BBB >BBBO #BBB; ", +" X ;BMNBNNBNBNBNBBNNBNBBNBNBBNBBNNBNBBNBBNNNBBNBNNBNBBNNBNBBNNBBBBNNBBNNBBBBNBx# 8BMNBNNBBBBNNBBNBNNBBBBNBp X .oo eNnMNNBa BBB1 %BBB %%%:BBB%%%% BBB:%*BBB4 +BBBo BBB% %BBB oBBB< 8BBa ", +" :BNNNBBNBNBNBNBBBNBBNBNBNNBNNBBNBNNBNNBNBNBBNBBNBNBBBNBNBBBNBNBBBNBBNBNBBNBx@ X X 8BMNBNBNNBNBNBNBNBBNNBBNBu X . eBnMnMMBa X BBBB1 %BBB %BBB BBB% *BBB ;BBB: BBB% %BBB >BBB;BBB; ", +" X :BNNNNBNNBBNBNBNBNBBBNBNBBBNBNBNBNBNBBBNBBNBBNBBNBNBBNBNBNBNNBNNBNBNBNBNBMBx# X 8BmBBNBBNBBNBBNBBBNBNBBNBu . eBMMMNMNBa BBBBB1 %BBB %BBB BBB% %BBB aBBBa BBB% %BBB OBBBBBB8 ", +" X :BNNNBNBBNNBNBNBNBBNNBNBBNBNNBBBNBNBBNNBBNBNNBBNBNBNNBNBBNNBBNBBNBNBNBNBBNBx# X 8BMNNBNBBNNBNBBNNBBNBNNNBp X X X...eBnNNNNBMBs X BBBBBB1 %BBB %BBB BBB% ;BBB *BBBBB; BBB% &BBB ;BBBBB% ", +"X ;BNNBNBBNBNBBBNBNBNBNNBBNBNBNBNBNBBBNBBNNBNNBNBBBBNBBNBBNBBNBBNBBNNBNBBNBNBx# 8BMBNNBNNBBNBNNBBNBBBNBNNp X X Xo..eNnnNNNNNNBa BBB4BBB1%BBB %BBB BBB:%;BBB4 8BBBBBw BBBBBBBBBBB aBBB8 ", +" X :BNNNBNBBNBNBNBNBNBNBBNNBNBNBNBNBNNNBNNBBNBBNBNNBNBNBBBNBNNBBNBNBBBNBNNBBNBx# 8BMNBNBBBNNBNBBNNBNNNBNNBp X o qBnMnBBNBNMBa BBB%1BBBwBBB %BBB BBBBBBBBB# #BBB*BBB% BBBBBBBBBBB ;BBB# ", +" ;BNNNNBBNBNBNBNBBBNBBNBNBNBNBBBNBNBNNBNBNBBNNBBNBNBNBNBNBBBNNBNBBNBNBBBNBNBx# X 8BmNBNBNNBNBBNBNBNNBNBNNBi X ...rBnMnMNNBNBNBa X BBB% 1BBBBBB %BBB BBBBBBBB; 1BB7 8BB4 BBBBBBBBBBB %BBB ", +" X :BNNBBNNBNNBBBBNNBBBNBNBBBNBNBNBNBNBBNNBBNNBBNNBNBBNNBNBNNNBBNBNNBNBNBNBBNBx# 8BMBNBNBBNBNNBBNNBBNBBBNBi X . .eBmNNNNNBNBNMBa BBB% 1BBBBB %BBB BBB1BBB+ +BBB; *BBB+ BBB:%%%:BBB %BBB ", +" ;BMNBNBNNBBNBNNNBNNBBNNBNBBNNBBBNBBNBBBNBBBBNBBBBBNBNBBNNBBNNBNBBNBNBNBNBMBx# 8BMNBNBNBNNBBBNBBBNBNBBMBi X Xoo.eBcmBBNNBNNNNNBs BBB% 1BBBB %BBB BBB%aBB> BBB% %BBB %BBB ", +" ;BmNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNNNBNNNNNNNNNBNBNBBNBNBNBBBNBBNBBBBNBx# X 8BmNNBNBBNNBBBNBBBNNNBNNBp o.wBNNMNNBNBBBNBNBMBa BBB% 1B %BBB BBB% %BBB; aBB> :BBB BBB% %BBB %BBB ", +" X X :BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBNBNNBNBNNBBNBNNBBNNNBMBx# X 8BNBNNNBNBBNNBBNNBNBBBBNBp ..oXwNcNBNNBNNBNBNNBNNBa . BBB% 4 %BBB BBB% 4BBBo;BBBo +BBB; BBB% %BBB %BBB ", +" *fsssssdddssssssdddssssssdsdddssssssssssddssdsssdshBNBNNBBNBNBNBNBBNBBBBBNBx# 8BmNBNBBBNNBBNBNBNNBNNBNBa o. eBnnNNNBNBBNBNBNBNNBa o +%%# #%%# ", +" X X =NNBNNBNBNBNBNNBNBNBNNBMBx# X 8BmBBNNNNNNNNNNNNNNNNBBNBu .XeBnnbNNNNNNNNNNNNNNNBa ", +" XXX X -BMBNNBNBBNBNBBNBNBBNBBNBx# 8BmNNNNNBNBNNNBNBNNNNBBNBa XeBnMnMNNNNBNBNNNBNBNNBa X ", +" X X X X X -BNBNNBBNBNBBBNBBNBNBNBNBx# 7NmmMMMMMMMMMMNMMMNNMMMmNy rMcMMMMMMMNMMMMNMNmmNmMp ", +" X X X -BBNBNBNBNBNBNBNNBNBBNBNBx# 0BBBBBBBBBBBBBBBBBBBBBBBBheBBBBBNBBBBBBBBBBBBBBBBBf ", +" -BNNBNBNNBBNNBNBBNBBBBBNBx# X :5444444444444444444444442544544444444444444444444< ", +" =BNBNBNBBNBBBNBBNBNBNNBNBx# . ", +" =BNBBBNBNBBNNBBNBNBBBNBmBx# XXXX X.XXXX X X XX XXX XX..X XXX .X . X. .X.o ", +" =BNNBNBNBNNBNBNBBBNBNBBNBx# X ", +" =BNBNBNBNNBNNBBNNBNBBNBNBx# ", +" X -BNNBBBNBBNBBNNBBNBNBBBNBx# ", +" =BNBBNBNNBBNNBBNBNNBBNBmBx# %1aBBa1# BBBBB4# BBBBBB4% %1aBBa1% %1aBBw<+ BBB% %BBB * BBBBBB4% ", +" X =BNBNBNBBNBBBNBBNBNBNBBNBx# + BBB% %BBB +B+ BBBBBBBB; ", +" X =BNNBNNBNBNBNBNBBNBNBNBNBx# qBBBBBBBBBB> BBBBBBB4 BBBBBBBBB% OqBBBBBBBBBBwo OqBBBBBBBBBB& BBB% %BBB >B< BBBBBBBBB% ", +" =BNBNBBNBNBBBNNBBNNBBNBMBx# %%:BB1 BBB:;BBB BBB:%=BBB4 BBB# BBBBBBBa* BBB% %BBB 1BBa+ oaBB1 1BBao BBB% %BBB aBBBa BBB% %BBB ", +" X =BNNBBNBNBNBBBNBBNBNBNBNBx# 8BB1 BBBBBBBBB< BBB% =BBB aBB: :BBa aBB: BBB% %BBB *BBBBB; BBB% ;BBB ", +" =BNBNNBNBNBNBNBNNBNBNBBMBx# BBB* BBBBBBBB BBBBBBBBBB% BBB:%;BBB4 BBB% %BBB BBB% BBBBBBBBBBB 8BBBBBw BBB:%=BBB4 ", +" X -BNNBNNBBNBBBNNBNBNBBNBNBx# BBB% BBBBBBBB BBB% o7BB4 BBBBBBBBB# BBB% %BBB BBB% BBBBBBBBBBB #BBB*BBB% BBBBBBBBB# ", +" -BNBNBBBNBNBNBNBBNBBBBBNBx# BBB* BBBBBBBB BBB% *BBB BBBBBBBB; aBB: :BBB aBB: BBBBBBBBBBB 1BB7 7BB4 BBBBBBBB; ", +" -BNBBBNNNNBNNBBBNBBNBBBNBx# 4BB4 %%%%7BB4 BBB% &BBB BBB1BBB+ 1BBao osBB1 1BBa BBB:%%%:BBB +BBB; *BBB+ BBB1BBB+ ", +" X -BNNNBNBBNNBBBNNBNBNNNBMBx# =BBB: ;BBB; BBB% >BBa BBB%aBB> %BBB1O O1BBB% &BBB1 O* BBB& %BBB ", +" =NMNNNNNNNNNNNNNNNNNNMNmBx# 8BBB8;%%*7BBB7 BBB:%%:BBB1 BBB%*BBB+ 1BBBa;%%:aBBB4 1BBBw;%%;aB; BBB% %BBB oBBBBBBBBBBBO BBB%*BBB+ ", +" ;BBBBBBBBBBBBBBBBBBBBBBBBm# oqBBBBBBBBBBwo BBBBBBBBBB+ BBB% 7BB8 +qBBBBBBBBBBwo owBBBBBBBBBB% BBB% %BBB :BBB77778BBB> BBB% 8BB7 ", +" %qqqqqqqqqqqqqqqqqqqqqqqq7+ o1BBBBBBBB1+ BBBBBBBBB% BBB% %BBB; O1BBBBBBBB1+ O4BBBBBBBB< BBB% %BBB aBB> :BBB BBB% %BBB= ", +" %1BBBB1% BBBBBBB1+ BBB% 4BBBo %1BBBB1% %1BBBa1+ BBB& %BBB ;BBB+ oBBB; BBB% 4BBB+ ", +" XXXXXXXX.XXXX.XXX..XX.oo.X +%%# %%%# ", +" . ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" " +}; diff --git a/xpm/rend.xpm b/xpm/rend.xpm new file mode 100644 index 0000000..fcc6d36 --- /dev/null +++ b/xpm/rend.xpm @@ -0,0 +1,702 @@ +/* XPM */ +static char *_484132450348[] = { +/* columns rows colors chars-per-pixel */ +"1000 640 56 1 ", +" c #000000", +". c #090907", +"X c #060608", +"o c #0D0D0D", +"O c #10110C", +"+ c #141414", +"@ c #191917", +"# c #1D1D1D", +"$ c #262626", +"% c #282826", +"& c #2E2E2E", +"* c #353534", +"= c #383836", +"- c #393939", +"; c #424242", +": c #4D4D4D", +"> c #565655", +", c #585858", +"< c #656565", +"1 c #6E6E6D", +"2 c #71716F", +"3 c #747473", +"4 c #787876", +"5 c #7B7B7A", +"6 c #81817F", +"7 c #848483", +"8 c #888886", +"9 c #8D8D8C", +"0 c #91918F", +"q c #969695", +"w c #999A97", +"e c #9B9B9A", +"r c #A1A19F", +"t c #A3A4A2", +"y c #A9AAA6", +"u c #AEAEAC", +"i c #B1B1AF", +"p c #B3B3B3", +"a c #B9B9B6", +"s c #B9B9B9", +"d c #C1C2BE", +"f c #C4C4C3", +"g c #C8C8C6", +"h c #CDCDCB", +"j c #D5D5D4", +"k c #D9D9D7", +"l c #DBDBDA", +"z c #E5E5E3", +"x c #EBECE6", +"c c #EDEEEA", +"v c #EFF0EB", +"b c #F2F3EE", +"n c #F5F6F3", +"m c #F7F8F3", +"M c #FBFBF6", +"N c #FFFFFD", +/* pixels */ +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" X ", +" X X X ", +" - X - ", +" NNNNNNNNNNNNNNNNNN7,& NNNNNNNNNNNNNNNNNNNNNNNNNNNN$ N- :NNNNNNNNN NNNNNNNNNNNNNNw7,&+ NNNNNNNNNNNNNNNNNNNNNNNNNNNN$ NNNNNNNNNNNNNNNNNN7,& X NNNNNNNNN: N- :NNNNNNNNN $-<7pNNNN77:-@ ", +" NNNNNNNNNNNNNNNNNNNNNN:+ NNNNNNNNNNNNNNNNNNNNNNNNNNNN$ NN- :NNNNNNNNN NNNNNNNNNNNNNNNNNNNq;o NNNNNNNNNNNNNNNNNNNNNNNNNNNN$ NNNNNNNNNNNNNNNNNNNNNN:@ NNNNNNNNN: NN- :NNNNNNNNN @,pNNNNNNNNNNNNNNq;o ", +" NNNNNNNNNNNNNNNNNNNNNNNN: NNNNNNNNNNNNNNNNNNNNNNNNNNNN$ NNN- :NNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN,o NNNNNNNNNNNNNNNNNNNNNNNNNNNN$ NNNNNNNNNNNNNNNNNNNNNNNN: NNNNNNNNN: NNN- :NNNNNNNNN #3NNNNNNNNNNNNNNNNNNNN<@ ", +" NNNNNNNNNNNNNNNNNNNNNNNNNq@ NNNNNNNNNNNNNNNNNNNNNNNNNNNN$ NNNN- :NNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNN: NNNNNNNNNNNNNNNNNNNNNNNNNNNN$ NNNNNNNNNNNNNNNNNNNNNNNNNq+ NNNNNNNNN: NNNN- :NNNNNNNNN o +pNNNNNNNNNN, NNNNNNNNNNNNNNNNNNNNNNNNNNNN$ NNNNNNNNN: -N NNNNNNNNNNNNNNq7:*o NNNNNNNNNNNNNNNNNNNNNNNNNNNN% NNNNNNNNN: +pNNNNNNNNNN, NNNNNNNNN: NNNNNNNNN: -N #;37NNNNNNq7:% oqNNNNNNq+ oqNNNNNNq+ +qNNNNNNq+ ", +" X - X - -3NN7- -3NN7- -3NN7- ", +" X X X ", +" X X X ", +" X X ", +" ", +" X ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" X X X X X X ", +" X X X X ", +" ", +" .X X. X XX X X XX X XX X XXX X XX XX X X XX XX X X X XX XX XXX XXXX XX XXX X X ", +" XXX X X ", +" oX qqqqqqqqqqqqqqqqqqqqqwqe8qqqqqqqqqqqqqqqqqqq0q0qwN, ", +" X 2NmmNNNNNMNNMNNMNMNMNMMmNl% .X X 7NmNMNNMNNNMNNNMNNMMMNio 7NmMNNNNMNMNNMNNNMMNNNMnNi X pNN7$3NNp ,NNNp;%$;NN- NNN;$$$$$@ NNN;*NNN NNN$ $NNN NNN$ oNNN+ ", +" XoX 2NbMmNMMMMNMMNMMMMNMNNnnNj% 8NmMNMMNMMMNMNMNNmbbNyo 7NmMMMMMNMNNMNMMNMNMMMMMNp NNN$ #777 %NNN c #4D4D4D", +", c #565656", +"< c #585858", +"1 c #656565", +"2 c #6E6E6E", +"3 c #71726F", +"4 c #747473", +"5 c #7B7B7A", +"6 c #81817F", +"7 c #838383", +"8 c #888886", +"9 c #8D8D8C", +"0 c #91918E", +"q c #969695", +"w c #999996", +"e c #9C9C9B", +"r c #A1A19F", +"t c #A3A4A2", +"y c #A9AAA6", +"u c #AEAEAC", +"i c #AFB0AB", +"p c #B1B1AF", +"a c #B3B3B2", +"s c #B9B9B6", +"d c #BABABA", +"f c #C1C2BE", +"g c #C4C4C4", +"h c #C8C8C6", +"j c #CDCDCB", +"k c #D3D3D3", +"l c #D9D9D7", +"z c #DBDBDA", +"x c #E5E5E3", +"c c #EAEBE6", +"v c #EAEAEA", +"b c #EFF0EA", +"n c #F2F3EE", +"m c #F5F6F2", +"M c #F7F8F3", +"N c #FBFCF6", +"B c #FFFFFE", +/* pixels */ +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" X ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBMM ", +" BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", +" BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", +" BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", +" BBBBBkkkkkkkkkkkkkkkkkkkkkkkkkkkllkkkkkkkkkklkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkklkkkkkkkkkkkkkkkkkkkkkkkllkkkkkkkkkkkkkkkkkklkkkkkkkkkkkllkkkkkkkkkklkkkkkkkkkklkkkkkkklkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkklkkkkkkkkkkkklkkkkkkkkkkkkkkkkkkkkkkklkkkkkkkkkkkkkkkkkkklkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkBBBBB ", +" BBBBB X X BBBBB ", +" BBBBB BBBBB ", +" BBBBB BBBBB ", +" BBBBB X X X BBBBB ", +" BBBBB . X X X X . X X X X X . X X X X BBBBB ", +" BBBBB X X X X X X X X X X X X X X X X X X X X X BBBBB ", +" BBBBB . @77% . . . X . X +77% X X X .X X X X X X BBBBB ", +" BBBBB X X ,BB> X X X >BB> o*>47aBBBw771>%o . X X BBBBB ", +" BBBBB BBBBBBBBBBBBBBBBBBBBs8>% oBBBBo oaBBBBBBBBBBBB< 4BBBBBBBBBBBB7 >BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB> BBBBBBBBBBBBBBBBBBBBa7,%X X oBBBB+ @:wBBBBBBBBBBBBBBBBw:+ X BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB% BBBBBBBBBBBBBBBBBBBBa7>% X BBBBB ", +" BBBBB X . BBBBBBBBBBBBBBBBBBBBBBBBB1@ ;BBBB; *BBBBBBBBBBBBB@ &BBBBBBBBBBBBB% >BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB> BBBBBBBBBBBBBBBBBBBBBBBBB1+ ;BBBB; +1BBBBBBBBBBBBBBBBBBBBBB4& BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB% BBBBBBBBBBBBBBBBBBBBBBBBB1@ . BBBBB ", +" BBBBB . BBBBBBBBBBBBBBBBBBBBBBBBBBB1+ aBBBBa 7BBBBBBBBBBBB1 7BBBBBBBBBBBB7 >BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB> BBBBBBBBBBBBBBBBBBBBBBBBBBB1+ aBBBBa X +BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB> BBBBBBBBBBBBBBBBBBBBBBBBBBBBB%X X *BBBBBB* %BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB> BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB% BBBBBBBBBBBBBBBBBBBBBBBBBBBBB% BBBBB ", +" BBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB; 7BBBBBB7 1BBBBBBBBBBBB7 aBBBBBBBBBBBB1 >BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB> BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB; 7BBBBBB7 >BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBe@ X BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB% BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB; X BBBBB ", +" BBBBB X BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB; #BBBBBBBB% +BBBBBBBBBBBBB% ;BBBBBBBBBBBBBo >BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB> BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB; #BBBBBBBB%X 1BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB$ BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB% BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB; X BBBBB ", +" BBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB; XX 1BBBBBBBB1 >BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB> BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB; 1BBBBBBBB1 1BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB+ BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB* BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB; . . BBBBB ", +" BBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB$ X @BBBBBBBBBB+ OBBBBBBBBBBBBB; >BBBBBBBBBBBBBo >BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB> BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB# X @BBBBBBBBBB+ 1BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB; BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB% BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB$ X BBBBB ", +" BBBBB XBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBw >BBBBBBBBBB< >BBBBBBBBBBBBao +BBBBBBBBBBBBB; >BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB> BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBw >BBBBBBBBBB< :BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB; BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB% BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBw BBBBB ", +" BBBBB . BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB; oBBBBBBBBBBBBo oaBBBBBBBBBBBB> 1BBBBBBBBBBBBa >BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB> BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB; oBBBBBBBBBBBBo #BBBBBBBBBBBBBBBBBa<;%%%:4BBBBBBBBBBBB; BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB% BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB; X XX BBBBB ", +" BBBBB BBBBBBBBBBBB @*1BBBBBBBBBBBBBBa :BBBBBBBBBBBB: ;BBBBBBBBBBBBB+ +BBBBBBBBBBBBB* BBBBBBBBBBBB BBBBBBBBBBBB +*1BBBBBBBBBBBBBBaX :BBBBBBBBBBBB: oaBBBBBBBBBBBBBBB7% o:aBBBBBBBB; BBBBBBBBBBBB BBBBBBBBBBBB +*1BBBBBBBBBBBBBBa BBBBB ", +" BBBBB BBBBBBBBBBBB +wBBBBBBBBBBBBB* aBBBBBBBBBBBBa aBBBBBBBBBBBB< 4BBBBBBBBBBBB7 BBBBBBBBBBBB BBBBBBBBBBBB +qBBBBBBBBBBBBB* aBBBBBBBBBBBBa >BBBBBBBBBBBBBBa% o ;BBBBBBBBBBBBBB; %BBBBBBBBBBBBB+%BBBBBBBBBBBBB% BBBBBBBBBBBB BBBBBBBBBBBB +aBBBBBBBBBBBB> ;BBBBBBBBBBBBBB; +BBBBBBBBBBBBBBwo *BBBB; BBBBBBBBBBBB BBBBBBBBBBBB oaBBBBBBBBBBBB> BBBBB ", +" BBBBB BBBBBBBBBBBB %BBBBBBBBBBBB7 7BBBBBBBBBBBBBB7 7BBBBBBBBBBBB17BBBBBBBBBBBB1 BBBBBBBBBBBB BBBBBBBBBBBB %BBBBBBBBBBBB7X 7BBBBBBBBBBBBBB7 X BBBBBBBBBBBB +BBBBBBBBBBBBBBBBBB+ +BBBBBBBBBBBBBBBBBBBBBBBB+ BBBBBBBBBBBB BBBBBBBBBBBB >BBBBBBBBBBBB +BBBBBBBBBBBBBBBBBB@ 4BBBBBBBBBBBB= BBBBBBBBBBBB BBBBBBBBBBBB >BBBBBBBBBBBB BBBBB ", +" BBBBB BBBBBBBBBBBB >BBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBBBB> BBBBBBBBBBBB BBBBBBBBBBBB >BBBBBBBBBBBB BBBBBBBBBBBB BBBBB ", +" BBBBB XBBBBBBBBBBBB X >BBBBBBBBBBBBBBBBBBBB; BBBBBBBBBBBB BBBBBBBBBBBB wBBBBBBBBBBBB :BBBBBBBBBBBBBBBBBBBB> >BBBBBBBBBBBa BBBBBBBBBBBB . BBBBBBBBBBBB wBBBBBBBBBBBBX X BBBBB ", +" BBBBB X BBBBBBBBBBBB %BBBBBBBBBBBB7 X aBBBBBBBBBBBBBBBBBBBBa aBBBBBBBBBBBBBBBBBBw BBBBBBBBBBBB BBBBBBBBBBBB %BBBBBBBBBBBB7 aBBBBBBBBBBBBBBBBBBBBa 1BBBBBBBBBBB< BBBBBBBBBBBBBBBBBBBBBBBBBBB& BBBBBBBBBBBB %BBBBBBBBBBBB7 BBBBB ", +" BBBBB BBBBBBBBBBBB X X +aBBBBBBBBBBBB1 ;BBBBBBBBBBBBBBBBBBBBBB; ;BBBBBBBBBBBBBBBBBB% BBBBBBBBBBBB BBBBBBBBBBBBX X oaBBBBBBBBBBBB1 ;BBBBBBBBBBBBBBBBBBBBBB; 7BBBBBBBBBBB; BBBBBBBBBBBBBBBBBBBBBBBBBBB% BBBBBBBBBBBB XX X oaBBBBBBBBBBBB1 BBBBB ", +" BBBBB BBBBBBBBBBBB owBBBBBBBBBBBBB; 7BBBBBBBBBBBBBBBBBBBBBBw wBBBBBBBBBBBBBBBB7 BBBBBBBBBBBB BBBBBBBBBBBB owBBBBBBBBBBBBB; 7BBBBBBBBBBBBBBBBBBBBBBwX 7BBBBBBBBBBB& BBBBBBBBBBBBBBBBBBBBBBBBBBB% X BBBBBBBBBBBB X owBBBBBBBBBBBBB; X. BBBBB ", +" BBBBB BBBBBBBBBBBB o;aBBBBBBBBBBBBBBo X%BBBBBBBBBBBBBBBBBBBBBBBB% %BBBBBBBBBBBBBBBB# BBBBBBBBBBBB BBBBBBBBBBBB o;aBBBBBBBBBBBBBBo %BBBBBBBBBBBBBBBBBBBBBBBB% XX BBBBBBBBBBBBo BBBBBBBBBBBBBBBBBBBBBBBBBBB& BBBBBBBBBBBB O;aBBBBBBBBBBBBBBo . BBBBB ", +" BBBBB X BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB1 1BBBBBBBBBBBBBBBBBBBBBBBB7 7BBBBBBBBBBBBBB1 BBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB1 1BBBBBBBBBBBBBBBBBBBBBBBB7 BBBBBBBBBBBB X BBBBBBBBBBBBBBBBBBBBBBBBBBB% BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB1 X BBBBB ", +" BBBBB . BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB+ +BBBBBBBBBBBBq1BBBBBBBBBBBB+ +BBBBBBBBBBBBBB+ BBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB+ @BBBBBBBBBBBBw1BBBBBBBBBBBB@ BBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBB% BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB+X BBBBB ", +" BBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB> 1BBBBBBBBBBBB=%BBBBBBBBBBBB1 1BBBBBBBBBBBB> BBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB> 1BBBBBBBBBBBB;#BBBBBBBBBBBB1 7BBBBBBBBBBB% BBBBBBBBBBBBBBBBBBBBBBBBBBB% BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB> X BBBBB ", +" BBBBB X BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBw +BBBBBBBBBBBBB wBBBBBBBBBBBB+ +BBBBBBBBBBBBo BBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBw oBBBBBBBBBBBBB wBBBBBBBBBBBBo 7BBBBBBBBBBB* X BBBBBBBBBBBBBBBBBBBBBBBBBBB% BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBw BBBBB ", +" BBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB+ >BBBBBBBBBBBB< ;BBBBBBBBBBBB> BBBBBBBBBBBB BBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB+ >BBBBBBBBBBBB< ;BBBBBBBBBBBB> 4BBBBBBBBBBB> X BBBBBBBBBBBBBBBBBBBBBBBBBBB% BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB+ BBBBB ", +" BBBBB . BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB$ . aBBBBBBBBBBBB+ BBBBBBBBBBBBB BBBBBBBBBBBB BBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB$ aBBBBBBBBBBBB+ BBBBBBBBBBBBB >BBBBBBBBBBBw BBBBBBBBBBBBBBBBBBBBBBBBBBB& BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB$ BBBBB ", +" BBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBB7+ X-BBBBBBBBBBBB4 >BBBBBBBBBBBB; BBBBBBBBBBBB BBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBB7# ;BBBBBBBBBBBB4 >BBBBBBBBBBBB; *BBBBBBBBBBBB+ BBBBBBBBBBBB X BBBBBBBBBBBBBBBBBBBBBBBBBBBBB7+ BBBBB ", +" BBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBa; wBBBBBBBBBBBB% @BBBBBBBBBBBBa BBBBBBBBBBBB BBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBa; wBBBBBBBBBBBB% +BBBBBBBBBBBBa oBBBBBBBBBBBB1 BBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBa; BBBBB ", +" BBBBB X BBBBBBBBBBBBBBBBBBBBBBBBBw% %BBBBBBBBBBBBa 1BBBBBBBBBBBB% BBBBBBBBBBBB BBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBw% %BBBBBBBBBBBBa 1BBBBBBBBBBBB% qBBBBBBBBBBBB$ BBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBw% BBBBB ", +" BBBBB BBBBBBBBBBBBBBBBBBBBBBBBBB$ X 4BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB7 BBBBBBBBBBBB BBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBB$ 4BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB7 XX :BBBBBBBBBBBBw X BBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBB# X X BBBBB ", +" BBBBB BBBBBBBBBBBB*BBBBBBBBBBBBBw @BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB$ BBBBBBBBBBBB BBBBBBBBBBBB BBBBBBBBBBBB*BBBBBBBBBBBBBe +BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB# +BBBBBBBBBBBBB1 X BBBBBBBBBBBB BBBBBBBBBBBB*BBBBBBBBBBBBBe BBBBB ", +" BBBBB X . BBBBBBBBBBBB 7BBBBBBBBBBBBB: X 1BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB1 BBBBBBBBBBBB BBBBBBBBBBBB BBBBBBBBBBBB 7BBBBBBBBBBBBB: 1BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB1 1BBBBBBBBBBBBB< o>># BBBBBBBBBBBB BBBBBBBBBBBB 7BBBBBBBBBBBBB: X BBBBB ", +" BBBBB . BBBBBBBBBBBB +BBBBBBBBBBBBBB+ +BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB+ BBBBBBBBBBBB BBBBBBBBBBBB BBBBBBBBBBBB +BBBBBBBBBBBBBB+ oBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB+ +BBBBBBBBBBBBBB1 @wBBB# BBBBBBBBBBBB BBBBBBBBBBBB +BBBBBBBBBBBBBB+ X BBBBB ", +" BBBBB BBBBBBBBBBBB :BBBBBBBBBBBBB7 >BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB> BBBBBBBBBBBB BBBBBBBBBBBB BBBBBBBBBBBB :BBBBBBBBBBBBB7 >BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB> + %7BBBBBBBB% BBBBBBBBBBBB X X X BBBBBBBBBBBB 7BBBBBBBBBBBBB: BBBBB ", +" BBBBB X BBBBBBBBBBBB $BBBBBBBBBBBBBB+ ;BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB; BBBBBBBBBBBB BBBBBBBBBBBB BBBBBBBBBBBB #BBBBBBBBBBBBBB@ ;BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB; =BBBBBBBBBBBBBBBBB4;# +%>wBBBBBBBBBBB# BBBBBBBBBBBB X BBBBBBBBBBBB X#BBBBBBBBBBBBBB+ X BBBBB ", +" BBBBB BBBBBBBBBBBB >BBBBBBBBBBBBB7 wBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBa BBBBBBBBBBBB BBBBBBBBBBBB BBBBBBBBBBBB >BBBBBBBBBBBBB7 wBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBs ,BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB# BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB%X BBBBBBBBBBBB >BBBBBBBBBBBBB7 BBBBB ", +" BBBBB BBBBBBBBBBBB wBBBBBBBBBBBBB: &BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB* BBBBBBBBBBBB BBBBBBBBBBBB BBBBBBBBBBBB qBBBBBBBBBBBBB: %BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB= 4BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB% BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB% BBBBBBBBBBBB wBBBBBBBBBBBBB: BBBBB ", +" BBBBB . BBBBBBBBBBBB $BBBBBBBBBBBBBB+ 8BBBBBBBBBBBB+ +BBBBBBBBBBBB7 BBBBBBBBBBBB BBBBBBBBBBBB BBBBBBBBBBBB %BBBBBBBBBBBBBB+ 7BBBBBBBBBBBB+ +BBBBBBBBBBBB7 owBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBo BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB% BBBBBBBBBBBB #BBBBBBBBBBBBBB+ . BBBBB ", +" BBBBB X BBBBBBBBBBBB BBBBBBBBBBBB; *BBBBBBBBBBBB< BBBBBBBBBBBB BBBBBBBBBBBB BBBBBBBBBBBB ,BBBBBBBBBBBBB4 >BBBBBBBBBBBB; *BBBBBBBBBBBB< X o1BBBBBBBBBBBBBBBBBBBBBBBBBBp= BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB* BBBBBBBBBBBB X ;BBBBBBBBBBBB: BBBBBBBBBBBB BBBBBBBBBBBB BBBBBBBBBBBB *BBBBBBBBBBBBBB+ ;BBBBBBBBBBBB> ;BBBBBBBBBBBB: +>>>>>>>>>>>+ +>>>>>>>>>>>>: BBBBBBBBBBBB BBBBBBBBBBBB BBBBBBBBBBBB 4BBBBBBBBBBBBB4 ;>>>>>>>>>>>>O o>>>>>>>>>>>>: +;<7aBBBBBBB74>% BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB% BBBBBBBBBBBB 4BBBBBBBBBBBBB4 BBBBB ", +" BBBBB BBBBB ", +" BBBBB BBBBB ", +" BBBBB BBBBB ", +" BBBBB BBBBB ", +" BBBBB BBBBB ", +" BBBBB BBBBB ", +" BBBBB BBBBB ", +" BBBBBvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvBBBBB ", +" BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", +" BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", +" BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", +" vBBBBvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" # ", +" BBBBBBBBBBBB7:+ BBBBBBBBBBBB7:+ BBBBBBBBBBBBBBBBBB7 &1aBBa1% %1aBBa1% BBBBBBBBBBBBBBBBBB7 B# %BBBBBB %BBBBBBBBBBBBBBBBBBBBB7 BBBBBBBBBBBBBBBBBB7 BBBBBBBBBBBB7:+ ", +" BBBBBBBBBBBBBBB>o BBBBBBBBBBBBBBB1o BBBBBBBBBBBBBBBBBB7 o4BBBBBBBB4o o4BBBBBBBB4o BBBBBBBBBBBBBBBBBB7 BB% %BBBBBB %BBBBBBBBBBBBBBBBBBBBB7 BBBBBBBBBBBBBBBBBB7 BBBBBBBBBBBBBBB1+ ", +" BBBBBBBBBBBBBBBBwo BBBBBBBBBBBBBBBBB# BBBBBBBBBBBBBBBBBB7 owBBBBBBBBBBwo owBBBBBBBBBBq+ BBBBBBBBBBBBBBBBBB7 BBB; %BBBBBB %BBBBBBBBBBBBBBBBBBBBB7 BBBBBBBBBBBBBBBBBB7 BBBBBBBBBBBBBBBBB# ", +" BBBBBBBBBBBBBBBBBBo BBBBBBBBBBBBBBBBBB# BBBBBBBBBBBBBBBBBB7 owBBBBBBBBBBBBwo owBBBBBBBBBBBBwo BBBBBBBBBBBBBBBBBB7 BBBB; %BBBBBB %BBBBBBBBBBBBBBBBBBBBB7 BBBBBBBBBBBBBBBBBB7 BBBBBBBBBBBBBBBBBB# ", +" BBBBBBBBBBBBBBBBBBwo BBBBBBBBBBBBBBBBBBB+ BBBBBBBBBBBBBBBBBB7 1BBBBBBBBBBBBBB1 1BBBBBBBBBBBBBB1 BBBBBBBBBBBBBBBBBB7 BBBBB; %BBBBBB %BBBBBBBBBBBBBBBBBBBBB7 BBBBBBBBBBBBBBBBBB7 BBBBBBBBBBBBBBBBBBB+ ", +" BBBBBBBBBBBBBBBBBBB> BBBBBBBBBBBBBBBBBBB7 BBBBBBBBBBBBBBBBBB7 +BBBBBBBBBBBBBBBB+ +BBBBBBBBBBBBBBBB+ BBBBBBBBBBBBBBBBBB7 BBBBBB; %BBBBBB %BBBBBBBBBBBBBBBBBBBBB7 BBBBBBBBBBBBBBBBBB7 BBBBBBBBBBBBBBBBBBB7 ", +" BBBBBB:%%%%;7BBBBBBB+ BBBBBB:%%%%>aBBBBBBB% BBBBBB:%%%%%%%%%%%# aBBBBBBB% ", +" BBBBBB% 1BBBBBB: BBBBBB% o1BBBBBB1 BBBBBB% 7BBBBBao 7BBBBBw 7BBBBBao 7BBBBBw BBBBBB% BBBBBBBB1 %BBBBBB %BBBBBB BBBBBB% BBBBBB% +1BBBBBB1 ", +" BBBBBB% aBBBBB7 BBBBBB% +BBBBBB7 BBBBBB% BBBBBB; *BBBBBB BBBBBB; *BBBBBB BBBBBB% BBBBBBBBB1 %BBBBBB %BBBBBB BBBBBB% BBBBBB% oBBBBBB7 ", +" BBBBBB% :BBBBBa BBBBBB% 1BBBBBB BBBBBB% BBBBBB% +%%%%%% BBBBBB% o%%%%%% BBBBBB% BBBBBBBBBB1 %BBBBBB %BBBBBB BBBBBB% BBBBBB% 1BBBBBB ", +" BBBBBB% %BBBBBB BBBBBB% >BBBBBB BBBBBB% aBBBBB< aBBBBB< BBBBBB% BBBBBBBBBBB1o %BBBBBB %BBBBBB BBBBBB% BBBBBB% >BBBBBB ", +" BBBBBB% *BBBBBB BBBBBB% ,BBBBBB BBBBBB% 4BBBBBB# 4BBBBBB# BBBBBB% BBBBBBBBBBBBwo %BBBBBB %BBBBBB BBBBBB% BBBBBB% o %BBBBBBB>+ BBBBBBBBBBBBBBB7 BBBBBBBBBBBBBw+ %BBBBBB %BBBBBB BBBBBBBBBBBBBBB7 BBBBBB% aBBBBBa ", +" BBBBBB% ;BBBBBB< BBBBBB% 1BBBBBB4 BBBBBBBBBBBBBBB7 7BBBBBBBB4; 7BBBBBBBB4; BBBBBBBBBBBBBBB7 BBBBBBBBBBBBBBwo %BBBBBB %BBBBBB BBBBBBBBBBBBBBB7 BBBBBB% 1BBBBBB4 ", +" BBBBBB% o>BBBBBBB$ BBBBBB% %4BBBBBBB; BBBBBBBBBBBBBBB7 owBBBBBBBBBa; owBBBBBBBBBa; BBBBBBBBBBBBBBB7 BBBBBB:BBBBBBBBwo %BBBBBB %BBBBBB BBBBBBBBBBBBBBB7 BBBBBB% #4BBBBBBB; ", +" BBBBBBBBBBBBBBBBBBB7 BBBBBBBBBBBBBBBBBBBB BBBBBBBBBBBBBBB7 owBBBBBBBBBB4o +qBBBBBBBBBB4o BBBBBBBBBBBBBBB7 BBBBBB%$wBBBBBBBa#%BBBBBB %BBBBBB BBBBBBBBBBBBBBB7 BBBBBBBBBBBBBBBBBBBB ", +" BBBBBBBBBBBBBBBBBBB+ BBBBBBBBBBBBBBBBBBB* BBBBBBBBBBBBBBB7 >BBBBBBBBBBw+ >BBBBBBBBBBwo BBBBBBBBBBBBBBB7 BBBBBB% owBBBBBBBB:BBBBBB %BBBBBB BBBBBBBBBBBBBBB7 BBBBBBBBBBBBBBBBBBB* ", +" BBBBBBBBBBBBBBBBBB* BBBBBBBBBBBBBBBBBB1 BBBBBBBBBBBBBBB7 +>BBBBBBBBB7 +>BBBBBBBBB7 BBBBBBBBBBBBBBB7 BBBBBB% OwBBBBBBBBBBBBBB %BBBBBB BBBBBBBBBBBBBBB7 BBBBBBBBBBBBBBBBBB1 ", +" BBBBBBBBBBBBBBBBB; BBBBBBBBBBBBBBBBB1 BBBBBB:%%%%%%&%# ;7BBBBBBB= ;7BBBBBBB; BBBBBB:%%%%%%%%# BBBBBB% owBBBBBBBBBBBBB %BBBBBB BBBBBB:%%%%%%&%# BBBBBBBBBBBBBBBBB1 ", +" BBBBBBBBBBBBBBBw# BBBBBBBBBBBBB %BBBBBB BBBBBB:%%%%%%%%%%%# BBBBBB% #BBBBBBB* ", +" BBBBBB% BBBBBB% %1aBBw,+ BBBBBBBBB> BBBBB4# BBB% %BBB BBB% * ", +" .. 3BBBBBBBBBBBBBBBBBBBBBBBBv;XX 8BBBBBBBBBBBBBBBBBBBBBBBaeBBBBBBBBBBBBBBBBBBBBBBBBd X 4BBBBB4 o1BBBBBBBB> BBBBBBBBB> BBBBBBB# BBB% %BBB BBB% oB+ ", +" 5MmNNNMNNNMNNNNNMNMMNNNmBk$ X. 7NnnNNNNNMNNNNNNNMNNMmBaX5NmNNNNMNNNNNNNNNMNNNNMmNp >BBBBBBB> owBBBBBBBBBB% BBBBBBBBB> BBBBBBB4 BBB% %BBB BBB% ,B< ", +" 3BMmBBBNBNBBNBBNNBBBNNNMBl% X 6BnNBNNBBNNBBNBNBNBNNBu. 8BNBNBBBNNBBNBNNBNBNBBNmBu X aBB7%4BBa ,BBBa:%%:BB= BBB:%%%%%+ BBB:;BBB BBB% %BBB BBB% oBBB+ ", +" Xo. 3BnNMBNNBNBNNBNNNNNNNBnMBk&X 8BMNNNBNNBNNNBNNNMnnBy.X 6BMNNNNNNBNNBBNBNBNNNNNNBa BBB% #777 %BBB1o +* BBB% BBB%$BBa BBB% %BBB BBB% ;BBB: ", +" XX 4BnNMNNBBBNNNNNNBNNNNNBmBl& 8BMNNNNBBNNBNNNBBncByO.o 6BNBNNNNNNBNBNBBNBNNNBNmBa BBB; 1BBao BBB% BBBBBBBa* BBB% &BBB BBB% aBBBa ", +" . 3BNNMNNNNNNNNBNNBNNBNBNMBz& X 8BMNNNBNNNNNNBBNBnBy. .. 8BNBNBNNNNBNNNNNNNBNNBNNBa X 1BBB:o aBB: BBB% BBBBBBBBB< BBB% %BBB BBB% *BBBBB; ", +" 4BnMNNNNNNNNNBNNNNNNBBBNBl& .X X . 8BMBNNBNNNNNNNBNNBy. XXX 6BNNNNBNNBNNNNNNNNNNNNNNBs +wBBBBBBa 7BB4 7BB4 BBB% oqBBBBBBBBBB% BBBBBBBBB> BBBBBBBBBB+ 4BBBBBBBB4 BBBBBBBBB> :BBB77777BBB> ", +" X 4BmNMNNBNBNBNNNBBNNNBNBMBz& 8BMNNNNBMcByO o X 7BNBNBNNNNBNBBNNBBNBNNNMBa 1BBBBB4 +4BBBBBBBB< BBBBBBBBB> BBBBBBBBB% o7BBBBBB4o BBBBBBBBB> aBB> :BBB ", +" X 4BmNNNNNNBNNBBNNBNNNNBNNBl& . 7BMNNNNNMBy. X.oX XX 7BMNBNNBNNBBBNNNNBNNNNBMBp XX >aBa> %1BBBa1+ BBBBBBBBB> BBBBBBB1+ ;wBBw; BBBBBBBBB>;BBBO oBBB; ", +" X 4BMmNNNMNBBNNNNBNNBNBNBMBl& X. X 8NMNBBNNNy.XXX 7BNBNNBNBNNNNNBBNNBBNNNMBaXX +%%# #%%# ", +" .. 3BnNNBNNNBNBBBNNNBNNBBmMBk& 8BMBnnnNto X 6BNBNBNNBBNBNBNBNNBNNBNNBa ", +" XXX 4BmNMBNBNBNNNNNBBNBNBNNmBl* 8BMNMbByo.. X 6BNBNNBNNNBNNBNNBNNBNBNMBa ", +" 2NNMMMNNNBNNBBNBNNBNBBNBBz& XX 8BMNbBy. oXX 7BNBNNBNBNNBNNBNBNNNNBNNBa X ", +" 5BbMNBMNBNNNNNNBNNBNBNNMBl& XX 8BMMNy.XXXXX X 6BMNBNNNBBNBNBNNNNBBNNNMBa ", +" . 3BNMNNNNNNNBBBNBNNBBNNnMBl& 7BnBt. X X 8BNNBBNNNNNNNBBBNBNBNBNNBp X ", +" X+ 4BnMMBBNBBNBNNBNNBNNNBNnBk% 6NNyO X 6BNBNNBBNBBBNNNNNBNNNNBMBpX ", +" o 9BMNMNBNBNNBNNBNNBNNBNNNBl& X X 5Buo o.X X 8BMNBBNBNNNBNNBBNNNNNBNMBa ", +" qBmNNNMMNBBNNNBNBNNNNBBNBl* . 0so .. X X 4BMBNNNBNBNNBNNNNBNBNNNMBs X ", +" X 9BMNNBNMBNNNNNBNBNBBNNNmBk% .X ;O X . XXpBNNNBBNNBBBNNNNNNNmBNNmBw ", +" .o. 8BnMNNNNBNBNBBNNBNBNNBmmBk% X orBNBNBNNNBNNBNNNMNMMNMBmNa+ ", +" .. qBnNmMNBNBNNNBBNNBNNNNBmBl& X X X tBMNBBNNBBBNNNNNNNNNNMNmBa. %1aBBa<# ;BBB oBBB; BBB% %1aBBa1# BBB% %BBB BBB% BBBBBBBBB> BBBBBB4% ", +" XX0BmmmNNNNNBNBNNNNBNBBBNNBz& X rBMnBNNBNNNNBBNBNNNNNNNnBao OX oBBa BBB% o BBBBBBBB; ", +" 0BmMNNNmBNBNNNBBNBBNNNNNBz&X X X XeBmMMNNNBBNNBBNNNNNNNBnmBao XX +wBBBBBBBBBBq >BBw aBB: BBB% wBBBBBBBBBB> BBB% %BBB BBB% BBBBBBBBB> BBBBBBBBB% ", +" XX. 9BnNNBNBBNNNNBNBNNNNBNnnBk& X .tBNNBNBBNNNBNNNNBNMMNNMnBso %%:BB1 BBB% %BBB BBB% BBB:%%%%%+ BBB:%*BBB4 ", +" X oo qBmMMNNNNNNBBNBBNNBNBBNmBz& X tBmBNNBNNBNNBBNBBNNNNnNMBpOX. X %BBB1 o7BBB# 1BB1 7BB, BBB%+BBBw+ o1 BBB% %BBB BBB% BBB% BBB% *BBB ", +" X 9BmmNNNBBBBBNNNNNNBNNNBNBz& XX . tBmNBBBNBNNBNNNBNNBNNMNnBao X 1BBa +aBB, #BBB+ #BBB+ BBB%>BBB# BBB% %BBB BBB% BBB% BBB% %BBB ", +" qBmmmNNNBNNNNNNBNNBNNBBNBl& oX rBMmMNNBNBNNBBNNNNNNBNMMBpo XX aBB; :BBw 7BB< 1BB4 BBB%7BB1 BBB% %BBB BBB% BBB% BBB% ;BBB ", +" XX 9BmNNNNNNNNBBNBBNBNBNBMmBh$ X X. .eBNNNBNBNNBNBNNNNNNMNNNnBaO BBB% %BBB *BBB#BBB% BBB%BBB= BBBBBBBB BBB% %BBB BBB% BBBBBBBB BBB:%;BBB4 ", +" oX 8BnMMNNNBNBBBNNBNBBNNBNvBg+ XXrBNNBBNBNNBNNBNNNNNNMmNNBa+ BBB% ;1 %BBB aBBwBBw BBB%BBB% BBBBBBBB BBB% %BBB BBB% BBBBBBBB BBBBBBBBB$ ", +" Xo 0BnNMMNBNNNBNNNBNNNNBNBMBg+ X XrNMNNBBNNNBNBNNNNNNNNMNmBdX o aBB; ;BB1:BBa ;BBBBB; BBB%BBB* BBBBBBBB BBB% %BBB BBB% BBBBBBBB BBBBBBBB; ", +" XwBmnMBMNNBBNNBNNBNBNBNBNBg+ + rBmnNNNNNBBBNNBNBNNNNNNmBao oX 1BBa wBBBBBB1 OBBBBa BBB%4BB4 %%%%7BB4 BBB% *BBB BBB% BBB:%%%% BBB1BBB+ ", +" X 9BMNNNNNNNNNBNNNBNBNBNNmBf+ . XrBmNMBNBNBNNNBNNNNMMNNMnBao X &BBB1 owBBBBB% BBB%;BBB: ;BBB; 7BB4 7BB4 BBB% BBB% BBB%aBB> ", +" XX 9BnMNBNNNBBNBNNNBBNBNBMbBf+ o yBNBBBNBNBNNNNNBNNNMMNNnBao 1BBBa;%%>BBBBw +BBBo BBB% 7BBB7;%%*7BBB7 ;BBB4%%4BBB* BBB% BBB:%%%%%+ BBB%*BBB+ ", +" oo qBnNMNNBBNNNNNBBNNNNBNNMBfO X .tBMBNNNBNBNNBBNBNNBNNMNnBaX owBBBBBBBBBBBB1 1B1 BBB% owBBBBBBBBBBwo 4BBBBBBBB4 BBB% BBBBBBBBB> BBB% 7BB7 ", +" X 0BmnNNNNBBNNBBNBNBNBNNBNBfO.. X XeBmMBNNBNBNBNNNBNBNBNMNnBao +X X o1BBBBBBBBBBB; %B+ BBB% o1BBBBBBBB1o O7BBBBBB4+ BBB% BBBBBBBBB> BBB% %BBB; ", +" XqBmmMNMMBNNNBNNBNNNNNBBMBgOX.. eBmmMNBBNBNNBNBNNBNNNNMMBa+ X X %1BBBa1%ow; > BBB% %1BBBB1% ;wBBw= BBB% BBBBBBBBB> BBB% 4BBBo ", +" ..X 9BnNNBNNNNNBBNBNBNBBNBmnBg+ X X X o XeBNNNNNNNBNNBBNNNNNMMNNnBdo ", +" o. 9BnMnNNBNBBNNNNNNBBNNNBmBg+ XrBMNBBNBBNNBNNNNNNNNNMNNBi+ ", +" X. 9BnMMNNBNNBNNNBBNBNNBBNMBgo X XrBnNBNNNNBNNBBNNNNNNNMMnBao oX ", +" qBnMMNMNNNBNNBBNNBNBNNNNBg+ + X wBMnMBNNBNNBNNNBNNNNNNMMBao XX ", +" Xo 9BNNNNNNBNNNBNNNNBNBNBNnBg+ X X X X X X XXXXX X XtBMNNNNNBBNNBBNNBBNNNNNvBao X X XXX ", +" o 9NnMMBNBNNNBNNBBNBNBBNNMBf@ X XX. X XX eBNNBBNBNBNNBNNBBNNBNNBNBpo XX. ", +" o qBnNMNNBNNBNBBNBNNBNNNNNNfO owBmBBNNBBNNBNBNNBNNNNBNNBsX o .oX ", +" X:BmmMNNNNBNBNNBNNNBNNBBNBMfyfsdadsdddsssssssssssssssssssssasssssssssssssaagt@ 2BmNNNBNNNNBBNNNBNNBBNNNBjo oX O< ", +" :BmNNNMBNBBNNBNNNBNNBNBNNNNBBBBBBBBBBBBNBBNBBBBBBBBBBBNBBBBBBBBBBBBBBBBBBBBv# X 8BMNNBNBNNBNNNNBNNBNNBNNBy XX X .yd ", +"X ;BMBNBNNNNNNBNNBNBBBNNNNBBNNNNNNNMNNNNNNBNNNNNNNNNNNBNNNNNNNNNNNNNNNNNMNNNBx@ 7BmNNNNNBBNNNBNBBNBNNBNNBu X XXo..wBp ", +" :BMNNNNNNBNBBNBBNNNNNBNNNNNNBBNNNBNBNBBBNNBNNBNNNBNNBNNNNNNNNNNNNBNNBNNBNMBx@ X 7BmNBNNBNBNBBBNNNNNBNNNNBp X ... wBNu o ", +" . ;BMNBNBNBNBNNNNNNBNBNBNBNBBNNNBNBNNBNNNNBNBNBNBNBNBNNBBBNBBNBBNBBNNBBBNNBNBx@ 8BmBBNNBNNNBNNNBBBNNBNBNBu X ..XrBcBa 4 %BBB BBBBBBBBBBB BBBBBB4% * BBB% &BBB 4BBB+ +BBB> ", +" ;BNNBNNNBNBNNBBNNBBBNBNBNNNBBNNNBNNBNNNBBNNNBNNNBBBNNNNNNBNBNNBNNBBBNNBNBNBx# X XX7BMNNNNBNBNNNBBNNNBNNBNNBp X o.wNMMBp B1 %BBB BBBBBBBBBBB BBBBBBBB; oB+ BBB% %BBB +BBB> 1BBao ", +" X :BNNNNBNNBNBBNNBNNNNNNBNNBBNNBBNNBBNNBNNNBBNBNBNNNNNBBNBBNNBNBNNBNNNNBNNBMBx# 8BMNNBNNNBNBBNNBBNNBBNNNBa .o..wNcNMBa X BB1 %BBB BBBBBBBBBBB BBBBBBBBB% >B< BBB% %BBB >BBBo #BBB; ", +" ;BMNNBBNNBNNBNNBNBNBBNBNNBNNNNBNNBBNNBNNNNNNNBNBNBBNBNNBNNBNNBNBBNNBBNBNBNBx@ 8BMBBNBNBNNBNNNNBNNBBNNNBu X Xo. wBnnNNNa BBB1 %BBB %%%:BBB%%%% BBB:%*BBB4 +BBBo BBB% %BBB oBBB< 7BBa ", +" X X :BNNBNNNBNBNNBNNNBNNBNNNBNNBBNNBNNNBNNNBBNBBNNNBNNBNNNBNNBNNBNBNNNBNBNNNBMBx# 8BMNNNNBNNBNNBBNNBNNNBNMBp .X eBnMbNMBs BBBB1 %BBB %BBB BBB% *BBB ;BBB: BBB% %BBB >BBB;BBB; ", +" X :BMNNBNBBNNNBNNBNNBNNNBNNBNBNNBNNNBNNBBNBBNBNBNNBNNBNNBNNNBNNNBNNBNBNNBNNNBx@ X 8BMNNNBNNBBNNBNNBNNBNNBNNi X ...wBMMMNNMBa BBBBB1 %BBB %BBB BBB% %BBB aBBBa BBB% %BBB +BBBBBB7 ", +" X ;BNNNNNNNBBNNBNBBNNBBNNBBNNBNBBNBNNBNNNNNNNNNBBNNBNBNBBNBNBNBNNBNNNBNBNNBNBx# 8BMNBNNBBNNNBNNBNBBNNBNNBp X .X.wNbNNNNNNBs BBBBBB1 %BBB %BBB BBB% ;BBB =BBBBB; BBB% %BBB ;BBBBB% ", +" X :BNNBNBNNNBNNBNNNNNNBNNBNNBNNNNNBBNBBNNBBNBBNNNBBNBNNNNNBBNNBNNBBNBNNBBBBNBx# X 8BMBNNBNNNNBBNBNNNBNNBNNBp X X XOX.wBbnNNNBNMBa BBB4BBB1%BBB %BBB BBB:%;BBB4 7BBBBBw BBBBBBBBBBB aBBB7 ", +" X ;BNNNBNBBNNNBNBNBBBNNBBNNBNNBBBNNNNNNBNBNNNNBNNNNBNNBBBNNNBNNBBNNBNNBNNNBMBx@ 8BMNBNNBNBBNNNBNBNNBBNNNBa X o wNnMMNBNNNNNa X BBB%1BBBwBBB %BBB BBBBBBBBB# #BBB*BBB% BBBBBBBBBBB ;BBB# ", +" :BNNNNNBBNNBBNBNNNBNNNNNNBNBNNNBBNBNNBNNNBNNNBBNNBNBNNNBBNBNNNNNNBNBNNBNBNBx# X 8BMNBNNNNBNNBNNNBNNNBNNNNu X o.XrBnnMMNNBNNNBp BBB% 1BBBBBB %BBB BBBBBBBB; 1BB7 7BB4 BBBBBBBBBBB %BBB ", +" X ;BNNBNBNNNBNNNBNBNNNBBNBBNBNNBBNNBNBBNNBNBBBNNNBNNBNNBBNNBNNBBNBBNBNNBBNBMBx@ 8NMNNNBNNNBBBNBNBNBNNBNNBp X XX.eBMNNNNNNNNBMBpX BBB% 1BBBBB %BBB BBB1BBB+ +BBB; *BBB+ BBB:%%%:BBB %BBB ", +" :BMNNBNNNBNNBBNNBBBNBNNNNNBNNBNNNNNBNNNBNNNBNBNBBBBNNBNNNNBNBNNBNNBNNBNNBMBx@ 8NMNNBNBBNBNNNBBNNBNBNNNBu oX.wBcnBNBNNNBNBNBa X BBB% 1BBBB %BBB BBB%aBB> BBB% %BBB %BBB ", +" :BnNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNBNNBNNBNBBNBNNBNNNBNNBMBx@ X X 7BMBNNBNNBNBNNBNNBNBNNNNBp o.wBMMMNNBBNNBNBBNNNa BBB% 1B %BBB BBB% %BBB; aBB> :BBB BBB% %BBB %BBB ", +" :BBBBNBBBBBBBNBBBBBBBBNBBBBBBBBNBBBBBBBNBBBBBNBBBBNBNBNNNBNNNBBNNBBNBNNBBNBx@ 6BMNBNNBBBNNNBBNNBNNNBBNBu XXo.wNcNBNNNNNNNBNNNBNBa BBB% 4 %BBB BBB% 4BBBo;BBBO +BBB; BBB% %BBB %BBB ", +" *fssssssddssssssddsssssssssssdssssssssssddssssaddshBNNBNNNBBNNNNBNNNBNBNBMBx# 8BMBNNBNNNNBBNNBNNNBNNBNBa o. eBnnNNNBNBBBNNNBNNMBp XX + +%%$ #%%# ", +" X X X X =BNNNNBNNBBNNBBNBNNNBNBMBx@ X 8BMNNNNNNNNNNNNNNNNNNBNNBi oXwNnMbNNNNNNNNNNNNNNMBa ", +" XX X =BNNBNNBNNNBNNNNBNBNBNBNBx# 8BMNNNBNBNNNNNBNBNNNNNBNBa wBnMnMNNNNNNNNBNBNNNNBa ", +" XX X X X X =BNBNNBNBNNNBNNBNNBBNNBNBx@ 8NnMMMNMMMMMMMMMMMMMNMNnNy rNcMMMMNMNMMMNMMMMMMMnNp ", +" X X X X X X X X X X =BNNNNBNNBBNNBBNBNNNNBBMBx# 9BBBBNBNBBBNBBNBNBBBBNBBBheBBBNBNNBNBBBNBNBBNBBBBBf X ", +" X =BNNNNNBBNNBBNNBNBBNBNBNBx@ :7444544444444444544444542545544544434445444444535, ", +" =BNBBBNNNBNNNBNNBNNNBNBMBx# X X X X X ", +" =BNNNBNBNBBNNBNBNNNBNNBMBx@ X XX X XXX X X.X .X XXX. X X X XXXX XX XX ", +" =BNBNNNBBNNBNNNBNBBNNBBNBx# X X X ", +" =BNNNBNNNNNBNBNNBBNNBNBNBx# ", +" =NNBNBBNNBBNNBBNNNNBNNBMBx@ ", +" X =NNNBNNNNBNNNNNNBNBNNBBNBx@ %1aBBa1# BBBBB4# BBBBBB4& %1aBBa1% %1aBBw<+ BBB% %BBB = BBBBBB4% ", +" X =BNBNNBBBNNBBNBBNNBNBNBMBx# + BBB% %BBB oB+ BBBBBBBB; ", +" X=NNNNBBNNNNBNNBNNBNNBNBMBx# qBBBBBBBBBB> BBBBBBB4 BBBBBBBBB% owBBBBBBBBBBwo owBBBBBBBBBB% BBB% %BBB >B< BBBBBBBBB% ", +" =BNBBNNNNBNBNBBNNBBNBNBNBx@ X %%:BB1 BBB:;BBB BBB:%*BBB4 ,BBBa;%%:aBBB, BBB# BBBBBBBa* BBB% %BBB 1BBaO +aBB1 1BBao BBB% %BBB aBBBa BBB% %BBB ", +" . =BNBNBNNNBBNNNBNNBNNBBBMBx@ 7BB1 BBBBBBBBB< BBB% ;BBB aBB: :BBa aBB: BBB% %BBB *BBBBB; BBB% ;BBB ", +" =BNNNNBBNNNBBNBNNBBNNNBNBx# BBB= BBBBBBBB BBBBBBBBBB% BBB:%;BBB4 BBB% %BBB BBB% BBBBBBBBBBB 7BBBBBw BBB:%;BBB4 ", +" =NNBBNBNBNNNBNNBBNNNNNBMBx@ BBB% BBBBBBBB BBB% o7BB4 BBBBBBBBB# BBB% %BBB BBB% BBBBBBBBBBB #BBB*BBB% BBBBBBBBB# ", +" X =BNNBNNNNBBNNBNNNNBBNBBNBx# BBB* BBBBBBBB BBB% =BBB BBBBBBBB; aBB: :BBB aBB: BBBBBBBBBBB 1BB7 7BB4 BBBBBBBB; ", +" ;BNBNNBBNNNBBNBNBNBNBNBNBx# 4BB4 %%%%7BB4 BBB% %BBB BBB1BBB+ 1BBao oaBB1 1BBa BBB:%%%:BBB +BBB; *BBB+ BBB1BBB+ ", +" ;BNNBNNNNBNNNNNNBNNNNNBNBx# ;BBB: ;BBB; BBB% >BBa BBB%aBB> %BBB1O O1BBB% %BBB1 o* BBB% %BBB ,BBBBBBBBB1 BBB%aBB> ", +" =NMNNNNNNMNNNNNNNNNNNMNmBz# 7BBB7;%%*7BBB7 BBB:%%:BBB1 BBB%*BBB+ 1BBBa;%%:aBBB4 1BBBw;%%;aB; BBB% %BBB oBBBBBBBBBBBO BBB%*BBB+ ", +" -BBBNBBBNBBBBBBBBNBBBNBBBm# owBBBBBBBBBBwo BBBBBBBBBB+ BBB% 7BB7 oqBBBBBBBBBBwo owBBBBBBBBBB% BBB% %BBB :BBB77777BBB> BBB% 7BB7 ", +" $qqqqqqqqqwqqqwqqqqqqqqqq7+ o1BBBBBBBB1+ BBBBBBBBB% BBB% %BBB; +1BBBBBBBB1+ o4BBBBBBBB< BBB% %BBB aBB> :BBB BBB% %BBB= ", +" %1BBBB1% BBBBBBB1+ BBB% 4BBBo %1BBBB1% %1BBBa1+ BBB% %BBB ;BBB+ oBBB; BBB% 4BBB+ ", +" . X. X.... . X X.. .XXoX +%%# $%%# ", +" X X XX X. ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" " +};