add obj parser

This commit is contained in:
2025-01-13 18:09:25 +01:00
parent 0482f34ce5
commit 449f059a07
10 changed files with 10480 additions and 18 deletions

BIN
RT

Binary file not shown.

View File

@ -7,10 +7,10 @@ Pos=1515,93
Size=368,276 Size=368,276
[Window][Material] [Window][Material]
Pos=1613,197 Pos=42,246
Size=290,238 Size=290,238
[Window][Camera] [Window][Camera]
Pos=1618,9 Pos=609,294
Size=279,183 Size=279,183

19
includes/RT/ObjParser.hpp Normal file
View File

@ -0,0 +1,19 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* ObjParser.hpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: tomoron <tomoron@student.42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/01/13 13:56:04 by tomoron #+# #+# */
/* Updated: 2025/01/13 13:56:05 by tomoron ### ########.fr */
/* */
/* ************************************************************************** */
# include "RT.hpp"
class ObjParser
{
public:
ObjParser(std::stringstream RT
}

View File

@ -6,7 +6,7 @@
/* By: TheRed <TheRed@students.42.fr> +#+ +:+ +#+ */ /* By: TheRed <TheRed@students.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2024/12/26 21:37:37 by TheRed #+# #+# */ /* Created: 2024/12/26 21:37:37 by TheRed #+# #+# */
/* Updated: 2024/12/26 21:37:37 by TheRed ### ########.fr */ /* Updated: 2025/01/13 17:39:22 by tomoron ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -25,6 +25,10 @@ class SceneParser
private: private:
void parseMaterial(std::stringstream &line); void parseMaterial(std::stringstream &line);
void parseCamera(std::stringstream &line); void parseCamera(std::stringstream &line);
void parseObj(std::stringstream &line);
glm::vec3 getVertex(std::stringstream &line);
Triangle *getFace(std::stringstream &line, std::vector<glm::vec3> &vertices);
long int getVertexIndex(std::stringstream &line, size_t size);
Scene *_scene; Scene *_scene;

View File

@ -1,12 +1,12 @@
/* ************************************************************************** */ /* ************************************************************************** */
/* */ /* */
/* ::: :::::::: */ /* ::: :::::::: */
/* Triangle.hpp :+: :+: :+: */ /* Triangle.hpp :+: :+: :+: */
/* +:+ +:+ +:+ */ /* +:+ +:+ +:+ */
/* By: ycontre <ycontre@student.42.fr> +#+ +:+ +#+ */ /* By: ycontre <ycontre@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2024/12/23 19:12:51 by ycontre #+# #+# */ /* Created: 2024/12/23 19:12:51 by ycontre #+# #+# */
/* Updated: 2024/12/23 19:47:09 by ycontre ### ########.fr */ /* Updated: 2025/01/13 17:59:21 by tomoron ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -53,7 +53,12 @@ class Triangle : public Object
catch (const std::exception &e) { throw; } catch (const std::exception &e) { throw; }
} }
Triangle(const glm::vec3& position, const glm::vec3& vertex2, const glm::vec3& vertex3, const int mat_index) Triangle(const glm::vec3& position, const glm::vec3& vertex2, const glm::vec3& vertex3, const int mat_index)
: Object(position, mat_index), _vertex2(vertex2), _vertex3(vertex3) {} : Object(position, mat_index), _vertex2(vertex2), _vertex3(vertex3) {
_vertex2 -= _position; //optimization
_vertex3 -= _position; //optimization
_normal = glm::normalize(glm::cross(_vertex2, _vertex3)); //optimization
}
const glm::vec3 &getVertex2() const { return (_vertex2); } const glm::vec3 &getVertex2() const { return (_vertex2); }
const glm::vec3 &getVertex3() const { return (_vertex3); } const glm::vec3 &getVertex3() const { return (_vertex3); }

402
obj/small_teapot.obj Normal file
View File

@ -0,0 +1,402 @@
v -2.998847 1.645154 0.000457
v -2.900348 1.679099 -0.256936
v -3.029228 1.729581 -0.001156
v -2.930359 2.062344 0.000174
v -2.919970 2.109288 0.191926
v -2.759439 1.333052 0.249274
v -2.711865 2.047712 -0.242985
v -2.799573 2.167019 0.001155
v -2.686656 1.076181 -0.001244
v -2.707166 1.972721 0.175423
v -2.701518 2.175746 0.000048
v -2.457971 0.877205 0.000371
v -2.705995 1.803827 0.000498
v -2.369685 1.013727 -0.241808
v -2.679516 1.881491 -0.000067
v -2.648943 1.572630 -0.000741
v -2.617158 1.939988 -0.000076
v -2.624174 1.499595 0.000005
v -2.506333 1.302899 0.000010
v -2.026995 0.896075 -0.001225
v -2.477661 1.986662 -0.000000
v -1.909678 0.571416 0.000217
v -2.383736 2.234244 -0.000120
v -2.326658 2.009734 -0.000010
v -1.917004 0.635344 -0.185152
v -1.993967 0.863085 -0.151109
v -1.993036 0.863311 0.153731
v -1.924329 0.661554 0.204106
v -1.491481 2.268714 -0.002043
v -1.566565 2.095632 -0.248300
v -2.072703 0.901436 -0.002127
v -1.566778 2.093798 0.253117
v -1.558684 0.143434 0.001543
v -1.932274 0.554012 0.000874
v -1.983200 2.023200 -0.000000
v -1.599999 2.026993 -0.000108
v -1.925916 1.568733 0.003710
v -1.797001 0.532327 -0.706683
v -1.605684 0.901280 -1.302611
v -1.664013 0.558143 1.025162
v -1.749975 1.536078 -0.740705
v -1.469110 2.447135 -0.000334
v -1.396439 0.902332 -1.554512
v -1.302611 0.901281 1.605684
v -1.403617 2.437531 -0.456951
v -1.554512 0.902332 1.396439
v -1.527784 0.155564 0.002394
v -1.150722 2.436876 0.990578
v -1.397048 0.155084 -0.591521
v -1.494668 2.252648 0.000530
v -1.482442 0.086117 0.000284
v -1.351893 0.027836 0.000086
v -1.415483 0.148414 -0.594728
v -0.990579 2.436876 -1.150722
v -1.239768 0.139419 0.913092
v -1.025162 0.558143 -1.664013
v -1.416229 2.392395 0.002407
v -1.344816 2.407518 -0.000978
v -1.355171 2.393945 0.005318
v -0.913092 0.139419 -1.239768
v -1.068988 2.395169 0.915107
v -1.056031 2.438143 -0.890852
v -0.890852 2.438143 1.056031
v -0.915107 2.395169 -1.068988
v -0.706683 0.532327 1.797001
v -0.190109 2.672948 0.000083
v -0.000086 0.027836 -1.351893
v -0.456951 2.437531 1.403616
v -0.591521 0.155084 1.397048
v 0.000533 0.894164 -2.105035
v -0.740705 1.536078 1.749975
v -0.594728 0.148414 1.415483
v -0.002127 0.901436 2.072703
v -0.461121 1.536164 -1.841184
v -0.005318 2.393945 -1.355171
v -0.148126 2.676843 -0.127884
v -0.127884 2.676843 0.148125
v -0.002394 0.155564 -1.527784
v -0.000340 0.150838 -1.518003
v 0.000086 0.027836 1.351893
v -0.002407 2.392395 -1.416230
v -0.000978 2.407518 1.344816
v -0.399019 0.001349 -0.000002
v -0.455880 3.069017 -0.006406
v -0.395396 3.096349 0.000833
v -0.006406 3.069017 0.455880
v -0.000002 0.001349 0.399019
v -0.000284 0.086117 -1.482442
v -0.000333 2.447135 1.469110
v -0.167793 2.680406 0.002325
v -0.162139 2.658880 -0.009998
v -0.009997 2.658880 0.162139
v -0.000833 3.096349 -0.395396
v -0.002325 2.680406 -0.167794
v 0.009997 2.658880 -0.162139
v 0.000978 2.407518 -1.344816
v 0.000284 0.086117 1.482442
v 0.000340 0.150838 1.518003
v 0.000333 2.447135 -1.469110
v 0.006406 3.069017 -0.455880
v -0.000083 2.672948 -0.190109
v 0.000000 0.000000 0.000000
v 0.000002 0.001349 -0.399019
v 0.002394 0.155564 1.527784
v -0.000533 0.894164 2.105035
v 0.002127 0.901435 -2.072703
v 0.005318 2.393945 1.355171
v 0.002407 2.392395 1.416229
v 0.000083 2.672948 0.190109
v 0.002325 2.680406 0.167793
v 0.000833 3.096349 0.395396
v 0.000000 3.150000 -0.000000
v 0.127884 2.676843 -0.148126
v 0.162139 2.658880 0.009997
v 0.148126 2.676843 0.127884
v 0.395396 3.096349 -0.000833
v 0.890852 2.438143 -1.056031
v 0.455880 3.069017 0.006405
v 0.167793 2.680406 -0.002326
v 0.190109 2.672948 -0.000083
v 0.399019 0.001349 0.000002
v 0.594728 0.148414 -1.415483
v 0.591521 0.155084 -1.397048
v 0.461121 1.536164 1.841184
v 0.706683 0.532327 -1.797001
v 1.351893 0.027836 -0.000086
v 1.056031 2.438143 0.890851
v 0.913092 0.139419 1.239768
v 0.456951 2.437531 -1.403617
v 0.740705 1.536078 -1.749975
v 1.025162 0.558144 1.664013
v 1.239768 0.139419 -0.913092
v 0.915107 2.395169 1.068987
v 0.990579 2.436876 1.150721
v 1.068988 2.395169 -0.915108
v 1.396439 0.902332 1.554512
v 1.150722 2.436876 -0.990579
v 1.302611 0.901280 -1.605684
v 1.554512 0.902332 -1.396440
v 1.605684 0.901281 1.302611
v 1.355171 2.393945 -0.005318
v 1.344816 2.407518 0.000978
v 1.664013 0.558143 -1.025162
v 1.415483 0.148414 0.594728
v 1.397048 0.155084 0.591521
v 1.403617 2.437531 0.456950
v 1.482442 0.086117 -0.000284
v 1.416229 2.392395 -0.002408
v 1.797001 0.532327 0.706683
v 1.469110 2.447135 0.000333
v 1.749975 1.536078 0.740705
v 1.527784 0.155564 -0.002394
v 1.518003 0.150838 -0.000340
v 1.841184 1.536164 -0.461121
v 1.932274 0.554012 -0.000874
v 1.700000 0.600000 -0.000000
v 1.705341 0.580740 0.001101
v 1.702548 0.843925 0.547911
v 1.707679 0.795519 -0.546724
v 1.700395 1.436783 0.001694
v 1.699852 1.444682 -0.002636
v 2.085115 0.897223 0.000993
v 2.072703 0.901436 0.002127
v 2.261466 1.561513 -0.001347
v 2.249750 1.538754 0.000403
v 2.417608 1.454605 -0.420344
v 2.300461 1.506508 0.288504
v 2.395219 1.130924 0.459536
v 2.481728 0.883141 0.002409
v 2.551987 0.988507 -0.003256
v 2.666492 2.402703 -0.000570
v 2.935153 2.394952 -0.179086
v 2.884470 2.397798 0.188027
v 2.703592 2.375964 -0.007074
v 2.922268 2.113822 0.001030
v 2.829248 2.452938 0.001739
v 2.818679 2.465921 -0.006725
v 2.798294 2.388002 0.002003
v 2.994468 2.405219 -0.198160
v 3.321051 2.479890 0.151112
v 3.212521 2.422510 0.000325
v 3.292305 2.430179 -0.009192
v 3.194853 2.429661 -0.002497
v 3.303009 2.449634 -0.001869
f 148 150 135
f 135 150 129
f 137 129 150
f 81 99 64
f 64 99 45
f 54 45 99
f 57 42 61
f 61 42 68
f 48 68 42
f 108 89 133
f 133 89 146
f 134 146 89
f 150 162 154
f 150 154 137
f 130 129 137
f 139 137 154
f 137 139 130
f 106 129 130
f 106 99 129
f 162 139 154
f 130 139 106
f 99 70 74
f 99 74 54
f 41 45 54
f 43 54 74
f 54 43 41
f 31 45 41
f 31 42 45
f 70 43 74
f 41 43 31
f 42 37 48
f 71 68 48
f 46 48 37
f 48 46 71
f 73 68 71
f 73 89 68
f 20 46 37
f 71 46 73
f 89 105 124
f 89 124 134
f 151 146 134
f 136 134 124
f 134 136 151
f 163 146 151
f 163 150 146
f 105 136 124
f 151 136 163
f 162 155 143
f 143 138 162
f 125 70 138
f 125 138 143
f 79 70 125
f 152 143 155
f 143 152 132
f 123 125 143
f 143 132 123
f 125 123 79
f 56 39 70
f 38 20 39
f 20 38 33
f 38 39 56
f 78 56 70
f 56 78 60
f 49 38 56
f 56 60 49
f 38 49 33
f 20 34 40
f 40 44 20
f 65 105 44
f 65 44 40
f 98 105 65
f 47 40 34
f 40 47 55
f 69 65 40
f 40 55 69
f 65 69 98
f 131 140 105
f 149 162 140
f 149 140 131
f 153 162 149
f 104 131 105
f 131 104 128
f 145 149 131
f 131 128 145
f 149 145 153
f 7 30 36
f 36 24 7
f 7 29 30
f 29 7 23
f 23 7 11
f 24 17 7
f 4 11 7
f 17 15 7
f 2 4 7
f 15 13 7
f 1 4 2
f 50 5 32
f 35 36 32
f 50 23 5
f 32 5 10
f 24 35 32
f 32 10 24
f 23 8 5
f 21 24 10
f 17 21 10
f 8 4 5
f 4 3 5
f 13 17 10
f 7 13 2
f 13 16 2
f 9 1 2
f 14 16 18
f 18 20 14
f 14 2 16
f 2 14 9
f 25 9 14
f 9 25 22
f 26 14 20
f 14 26 25
f 6 5 3
f 10 5 13
f 18 13 5
f 3 9 6
f 9 12 6
f 19 18 5
f 5 6 19
f 20 19 6
f 6 28 27
f 12 22 28
f 28 6 12
f 6 27 20
f 161 164 166
f 166 159 161
f 170 157 159
f 159 166 170
f 172 170 166
f 171 166 164
f 166 171 172
f 175 170 172
f 182 175 172
f 169 158 156
f 158 168 167
f 167 160 158
f 160 167 165
f 168 158 169
f 169 175 173
f 173 168 169
f 168 173 167
f 171 165 167
f 167 173 171
f 175 184 180
f 180 173 175
f 177 179 174
f 184 179 183
f 178 179 177
f 179 178 183
f 176 174 173
f 173 180 176
f 184 181 180
f 178 176 180
f 180 181 178
f 112 116 100
f 95 100 116
f 116 119 95
f 112 93 84
f 91 84 93
f 93 94 91
f 112 85 86
f 92 86 85
f 85 90 92
f 112 111 118
f 114 118 111
f 111 110 114
f 117 113 120
f 117 101 113
f 96 101 117
f 120 141 117
f 62 76 101
f 62 66 76
f 58 66 62
f 101 75 62
f 63 77 66
f 63 109 77
f 82 109 63
f 66 59 63
f 127 115 109
f 127 120 115
f 142 120 127
f 109 107 127
f 102 121 80
f 121 126 80
f 128 80 126
f 80 128 97
f 144 128 126
f 126 153 144
f 98 97 128
f 102 87 52
f 87 80 52
f 55 52 80
f 52 55 51
f 72 55 80
f 80 98 72
f 33 51 55
f 102 83 67
f 83 52 67
f 60 67 52
f 67 60 88
f 53 60 52
f 52 33 53
f 79 88 60
f 102 103 126
f 103 67 126
f 132 126 67
f 126 132 147
f 122 132 67
f 67 79 122
f 153 147 132

9966
obj/teapot.obj Normal file

File diff suppressed because it is too large Load Diff

View File

@ -12,12 +12,14 @@ MAT 255 255 255 5.0 0.0 0.0 //light
# sp -100 30 50 50 6 # sp -100 30 50 50 6
sp 0 -25 0 50 4 #sp 0 -25 0 50 4
#
#sp 1 1 -0.5 2 0
#sp -0.8 0.8 0 1.5 1
#sp -2.2 0.4 0.25 1 2
#sp -3 0.2 0.50 0.75 3
#sp -3.8 -0.1 0.60 0.5 5
#
#cy 0 1 2 0.5 2 -1.5 0 0.75 1
sp 1 1 -0.5 2 0 OBJ obj/teapot.obj
sp -0.8 0.8 0 1.5 1
sp -2.2 0.4 0.25 1 2
sp -3 0.2 0.50 0.75 3
sp -3.8 -0.1 0.60 0.5 5
cy 0 1 2 0.5 2 -1.5 0 0.75 1

View File

@ -6,7 +6,7 @@
/* By: ycontre <ycontre@student.42.fr> +#+ +:+ +#+ */ /* By: ycontre <ycontre@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2024/09/27 14:51:49 by TheRed #+# #+# */ /* Created: 2024/09/27 14:51:49 by TheRed #+# #+# */
/* Updated: 2025/01/11 16:14:24 by tomoron ### ########.fr */ /* Updated: 2025/01/13 17:40:45 by tomoron ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */

View File

@ -6,7 +6,7 @@
/* By: TheRed <TheRed@students.42.fr> +#+ +:+ +#+ */ /* By: TheRed <TheRed@students.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2024/12/26 21:43:51 by TheRed #+# #+# */ /* Created: 2024/12/26 21:43:51 by TheRed #+# #+# */
/* Updated: 2024/12/26 21:43:51 by TheRed ### ########.fr */ /* Updated: 2025/01/13 17:59:30 by tomoron ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -127,6 +127,68 @@ void SceneParser::parseCamera(std::stringstream &line)
} }
glm::vec3 SceneParser::getVertex(std::stringstream &line)
{
glm::vec3 res;
std::cout << line.str() << std::endl;
if(!(line >> res.x >> res.y >> res.z))
throw std::runtime_error("syntax error in obj file while parsing vertex");
res.z *= -1;
return(res);
}
long int SceneParser::getVertexIndex(std::stringstream &line, size_t size)
{
long int index;
if(!(line >> index))
throw std::runtime_error("syntax error in obj file while parsing face");
if((size_t)index > size || index == 0 || (index < 0 && (size_t)(-index) > size))
throw std::runtime_error("obj file error, invalid vertex index");
if(index < 0)
index = size - index;
return(index - 1);
}
Triangle *SceneParser::getFace(std::stringstream &line, std::vector<glm::vec3> &vertices)
{
glm::vec3 triangle[3];
triangle[0] = vertices[getVertexIndex(line, vertices.size())];
triangle[1] = vertices[getVertexIndex(line, vertices.size())];
triangle[2] = vertices[getVertexIndex(line, vertices.size())];
std::cout << triangle[0].x << " " << triangle[0].y << " " << triangle[0].z << std::endl;
std::cout << triangle[1].x << " " << triangle[1].y << " " << triangle[1].z << std::endl;
std::cout << triangle[2].x << " " << triangle[2].y << " " << triangle[2].z << std::endl;
return(new Triangle(triangle[0], triangle[1], triangle[2], 0));
}
void SceneParser::parseObj(std::stringstream &objInfo)
{
std::vector<glm::vec3> vertices;
std::string filename;
std::string line;
std::string identifier;
std::ifstream file;
objInfo >> filename;
file.open(filename);
if (!file.is_open())
throw std::runtime_error("OBJ : could not open object file");
while (getline(file, line))
{
if(line[0] == '#' || line.empty())
continue;
std::stringstream lineStream(line);
lineStream >> identifier;
if(identifier == "v")
vertices.push_back(getVertex(lineStream));
else if (identifier == "f")
_scene->addObject(getFace(lineStream, vertices));
}
}
bool SceneParser::parseLine(const std::string &line) bool SceneParser::parseLine(const std::string &line)
{ {
if (line.empty() || line[0] == '#') if (line.empty() || line[0] == '#')
@ -155,6 +217,8 @@ bool SceneParser::parseLine(const std::string &line)
this->parseMaterial(ss); this->parseMaterial(ss);
else if (identifier == "CAM") else if (identifier == "CAM")
this->parseCamera(ss); this->parseCamera(ss);
else if (identifier == "OBJ")
parseObj(ss);
} }
catch (const std::exception& e) catch (const std::exception& e)
{ {