mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 19:57:45 +00:00
3DFileViewer: Add vertex normal parsing to WavefrontOBJLoader
This change allows us to parse vertex-normal lines "vn x y z" and map them to the correct index on face lines ("f v1/vt1/vn1").
This commit is contained in:
parent
a8fed919e7
commit
7fb8af73bf
2 changed files with 41 additions and 6 deletions
|
@ -1,6 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2021, Jesse Buhagiar <jooster669@gmail.com>
|
* Copyright (c) 2021, Jesse Buhagiar <jooster669@gmail.com>
|
||||||
* Copyright (c) 2021, Mathieu Gaillard <gaillard.mathieu.39@gmail.com>
|
* Copyright (c) 2021, Mathieu Gaillard <gaillard.mathieu.39@gmail.com>
|
||||||
|
* Copyright (c) 2021, Pedro Pereira <pmh.pereira@gmail.com>
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-2-Clause
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
*/
|
*/
|
||||||
|
@ -30,4 +31,8 @@ struct Triangle {
|
||||||
GLuint tex_coord_index0;
|
GLuint tex_coord_index0;
|
||||||
GLuint tex_coord_index1;
|
GLuint tex_coord_index1;
|
||||||
GLuint tex_coord_index2;
|
GLuint tex_coord_index2;
|
||||||
|
|
||||||
|
GLuint normal_index0;
|
||||||
|
GLuint normal_index1;
|
||||||
|
GLuint normal_index2;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2021, Jesse Buhagiar <jooster669@gmail.com>
|
* Copyright (c) 2021, Jesse Buhagiar <jooster669@gmail.com>
|
||||||
* Copyright (c) 2021, Mathieu Gaillard <gaillard.mathieu.39@gmail.com>
|
* Copyright (c) 2021, Mathieu Gaillard <gaillard.mathieu.39@gmail.com>
|
||||||
|
* Copyright (c) 2021, Pedro Pereira <pmh.pereira@gmail.com>
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-2-Clause
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
*/
|
*/
|
||||||
|
@ -12,6 +13,7 @@
|
||||||
RefPtr<Mesh> WavefrontOBJLoader::load(Core::File& file)
|
RefPtr<Mesh> WavefrontOBJLoader::load(Core::File& file)
|
||||||
{
|
{
|
||||||
Vector<Vertex> vertices;
|
Vector<Vertex> vertices;
|
||||||
|
Vector<Vertex> normals;
|
||||||
Vector<TexCoord> tex_coords;
|
Vector<TexCoord> tex_coords;
|
||||||
Vector<Triangle> triangles;
|
Vector<Triangle> triangles;
|
||||||
|
|
||||||
|
@ -39,8 +41,17 @@ RefPtr<Mesh> WavefrontOBJLoader::load(Core::File& file)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: Parse texture coordinates and vertex normals
|
|
||||||
if (object_line.starts_with("vn")) {
|
if (object_line.starts_with("vn")) {
|
||||||
|
auto normal_line = object_line.split_view(' ');
|
||||||
|
if (normal_line.size() != 4) {
|
||||||
|
dbgln("Wavefront: Malformed vertex normal line. Aborting.");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
normals.append({ static_cast<GLfloat>(atof(String(normal_line.at(1)).characters())),
|
||||||
|
static_cast<GLfloat>(atof(String(normal_line.at(2)).characters())),
|
||||||
|
static_cast<GLfloat>(atof(String(normal_line.at(3)).characters())) });
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,9 +66,12 @@ RefPtr<Mesh> WavefrontOBJLoader::load(Core::File& file)
|
||||||
vertices.append({ static_cast<GLfloat>(atof(String(vertex_line.at(1)).characters())),
|
vertices.append({ static_cast<GLfloat>(atof(String(vertex_line.at(1)).characters())),
|
||||||
static_cast<GLfloat>(atof(String(vertex_line.at(2)).characters())),
|
static_cast<GLfloat>(atof(String(vertex_line.at(2)).characters())),
|
||||||
static_cast<GLfloat>(atof(String(vertex_line.at(3)).characters())) });
|
static_cast<GLfloat>(atof(String(vertex_line.at(3)).characters())) });
|
||||||
|
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// This line describes a face (a collection of 3 vertices, aka a triangle)
|
// This line describes a face (a collection of 3 vertices, aka a triangle)
|
||||||
else if (object_line.starts_with("f")) {
|
if (object_line.starts_with("f")) {
|
||||||
auto face_line = object_line.split_view(' ');
|
auto face_line = object_line.split_view(' ');
|
||||||
if (face_line.size() != 4) {
|
if (face_line.size() != 4) {
|
||||||
dbgln("Wavefront: Malformed face line. Aborting.");
|
dbgln("Wavefront: Malformed face line. Aborting.");
|
||||||
|
@ -66,10 +80,18 @@ RefPtr<Mesh> WavefrontOBJLoader::load(Core::File& file)
|
||||||
|
|
||||||
GLuint vert_index[3];
|
GLuint vert_index[3];
|
||||||
GLuint tex_coord_index[3];
|
GLuint tex_coord_index[3];
|
||||||
|
GLuint normal_index[3];
|
||||||
if (object_line.contains("/")) {
|
if (object_line.contains("/")) {
|
||||||
for (int i = 1; i <= 3; ++i) {
|
for (int i = 1; i <= 3; ++i) {
|
||||||
vert_index[i - 1] = face_line.at(i).split_view("/").at(0).to_uint().value_or(1);
|
auto vertex_data = face_line.at(i).split_view("/", true);
|
||||||
tex_coord_index[i - 1] = face_line.at(i).split_view("/").at(1).to_uint().value_or(1);
|
|
||||||
|
vert_index[i - 1] = vertex_data.at(0).to_uint().value_or(1);
|
||||||
|
tex_coord_index[i - 1] = vertex_data.at(1).to_uint().value_or(1);
|
||||||
|
|
||||||
|
if (vertex_data.size() == 3)
|
||||||
|
normal_index[i - 1] = vertex_data.at(2).to_uint().value_or(1);
|
||||||
|
else
|
||||||
|
normal_index[i - 1] = 1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
vert_index[0] = (face_line.at(1).to_uint().value_or(1));
|
vert_index[0] = (face_line.at(1).to_uint().value_or(1));
|
||||||
|
@ -78,16 +100,24 @@ RefPtr<Mesh> WavefrontOBJLoader::load(Core::File& file)
|
||||||
tex_coord_index[0] = 0;
|
tex_coord_index[0] = 0;
|
||||||
tex_coord_index[1] = 0;
|
tex_coord_index[1] = 0;
|
||||||
tex_coord_index[2] = 0;
|
tex_coord_index[2] = 0;
|
||||||
|
normal_index[0] = 0;
|
||||||
|
normal_index[1] = 0;
|
||||||
|
normal_index[2] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a new triangle
|
// Create a new triangle
|
||||||
triangles.append(
|
triangles.append(
|
||||||
{ vert_index[0] - 1,
|
{
|
||||||
|
vert_index[0] - 1,
|
||||||
vert_index[1] - 1,
|
vert_index[1] - 1,
|
||||||
vert_index[2] - 1,
|
vert_index[2] - 1,
|
||||||
tex_coord_index[0] - 1,
|
tex_coord_index[0] - 1,
|
||||||
tex_coord_index[1] - 1,
|
tex_coord_index[1] - 1,
|
||||||
tex_coord_index[2] - 1 });
|
tex_coord_index[2] - 1,
|
||||||
|
normal_index[0] - 1,
|
||||||
|
normal_index[1] - 1,
|
||||||
|
normal_index[2] - 1,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue