forked from GroteGnoom/codam_miniRT
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathparse_objects.c
More file actions
128 lines (117 loc) · 4.23 KB
/
Copy pathparse_objects.c
File metadata and controls
128 lines (117 loc) · 4.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/* ************************************************************************** */
/* */
/* :::::::: */
/* parse_objects.c :+: :+: */
/* +:+ */
/* By: dnoom <marvin@codam.nl> +#+ */
/* +#+ */
/* Created: 2022/04/06 11:25:33 by dnoom #+# #+# */
/* Updated: 2022/04/06 11:25:33 by dnoom ######## odam.nl */
/* */
/* ************************************************************************** */
#include "miniRT.h"
t_material_type parse_check_material(t_parse_line *line)
{
char material;
skip_one_or_more_char(line, ' ');
parse_check_char(line, &material, "cnm");
if (material == 'c')
return (CHECKER);
else if (material == 'n')
return (NORMAL);
else
return (MIRROR);
}
void parse_sphere(t_parse_line *line, t_scene *scene)
{
t_object o;
t_sphere *s;
s = &o.sphere;
parse_vec3f(line, &s->base.pos);
skip_one_or_more_char(line, ' ');
parse_check_float_pos(line, &s->radius);
s->radius /= 2;
skip_one_or_more_char(line, ' ');
parse_check_color(line, &s->base.color, 0, 255);
if (BONUS)
{
s->base.material = parse_check_material(line);
parse_texture(&s->base.texture, line);
parse_texture(&s->base.bump_map, line);
}
skip_one_or_more_char(line, '\n');
s->base.get_color = get_sphere_color;
s->base.get_normal = get_sphere_normal;
s->base.type = SPHERE;
vec_push(&scene->objects, &o);
}
void parse_plane(t_parse_line *line, t_scene *scene)
{
t_object o;
t_plane *p;
p = &o.plane;
parse_vec3f(line, &p->dir_base.base.pos);
skip_one_or_more_char(line, ' ');
parse_check_vec3f(line, &p->dir_base.dir, -1, 1);
check_can_be_normalized(p->dir_base.dir, line, "Plane direction");
p->dir_base.dir = vec3f_unit(p->dir_base.dir);
skip_one_or_more_char(line, ' ');
parse_check_color(line, &p->dir_base.base.color, 0, 255);
if (BONUS)
{
p->dir_base.base.material = parse_check_material(line);
parse_texture(&p->dir_base.base.texture, line);
parse_texture(&p->dir_base.base.bump_map, line);
}
skip_one_or_more_char(line, '\n');
p->dir_base.base.type = PLANE;
p->dir_base.base.get_color = get_plane_color;
p->dir_base.base.get_normal = get_plane_normal;
vec_push(&scene->objects, &o);
}
void parse_cylinder(t_parse_line *line, t_scene *scene)
{
t_object o;
t_cylinder *c;
c = &o.cylinder;
parse_vec3f(line, &c->dir_base.base.pos);
skip_one_or_more_char(line, ' ');
parse_check_vec3f(line, &c->dir_base.dir, -1, 1);
check_can_be_normalized(c->dir_base.dir, line, "Cylinder direction");
skip_one_or_more_char(line, ' ');
parse_check_float_pos(line, &c->radius);
c->radius /= 2;
skip_one_or_more_char(line, ' ');
parse_check_float_pos(line, &c->height);
skip_one_or_more_char(line, ' ');
parse_check_color(line, &c->dir_base.base.color, 0, 255);
if (BONUS)
c->dir_base.base.material = parse_check_material(line);
skip_one_or_more_char(line, '\n');
c->dir_base.dir = vec3f_unit(c->dir_base.dir);
c->dir_base.base.type = CYLINDER;
c->dir_base.base.get_color = get_cylinder_color;
c->dir_base.base.get_normal = get_cylinder_normal;
vec_push(&scene->objects, &o);
}
void parse_paraboloid(t_parse_line *line, t_scene *scene)
{
t_object o;
t_paraboloid *p;
p = &o.paraboloid;
parse_vec3f(line, &p->dir_base.base.pos);
skip_one_or_more_char(line, ' ');
parse_check_vec3f(line, &p->dir_base.dir, -1, 1);
check_can_be_normalized(p->dir_base.dir, line, "Paraboloid direction");
p->dir_base.dir = vec3f_unit(p->dir_base.dir);
skip_one_or_more_char(line, ' ');
parse_float(line, &p->curvature);
skip_one_or_more_char(line, ' ');
parse_check_color(line, &p->dir_base.base.color, 0, 255);
p->dir_base.base.material = parse_check_material(line);
skip_one_or_more_char(line, '\n');
p->dir_base.base.type = PARABOLOID;
p->dir_base.base.get_color = get_paraboloid_color;
p->dir_base.base.get_normal = get_paraboloid_normal;
vec_push(&scene->objects, &o);
}