Skip to content

Commit 605e5cb

Browse files
author
Cheng Xie
committed
Moved obj loading to MeshUtility from Mesh
1 parent 74bddda commit 605e5cb

11 files changed

+131
-91
lines changed

src/camera.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44

55
Camera::Camera()
66
{
7-
near_ = 0.1;
8-
far_ = 1000;
7+
near_ = 1;
8+
far_ = 10000;
99
aspectRatio_ = 1;
1010
heightAngle_ = 60;
1111

src/final.pro

+6-3
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,12 @@ SOURCES += main.cpp \
3535
particlesystem.cpp \
3636
phongmaterial.cpp \
3737
particlematerial.cpp \
38-
shader.cpp \
3938
skybox.cpp \
4039
skyboxmaterial.cpp \
4140
texture2d.cpp \
42-
texturecube.cpp
41+
texturecube.cpp \
42+
terrain.cpp \
43+
meshutility.cpp
4344

4445
HEADERS += mainwindow.h \
4546
view.h \
@@ -67,6 +68,8 @@ HEADERS += mainwindow.h \
6768
skybox.h \
6869
skyboxmaterial.h \
6970
texture2d.h \
70-
texturecube.h
71+
texturecube.h \
72+
terrain.h \
73+
meshutility.h
7174

7275
FORMS += mainwindow.ui

src/mesh.cpp

+1-77
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
#include "GL/glew.h"
22
#include "mesh.h"
3-
#include <QFile>
4-
#include <QTextStream>
5-
#include <QRegExp>
6-
#include <QStringList>
3+
74

85
Mesh::Mesh()
96
{
@@ -17,79 +14,6 @@ Mesh::~Mesh()
1714
glDeleteBuffers(1, &indexBufferObject_);
1815
}
1916

20-
void Mesh::load(string filename)
21-
{
22-
vector<SimpleVertex> vertexBuffer;
23-
IndexBuffer indexBuffer;
24-
25-
vector<vec3> normals;
26-
vector<vec2> uvs;
27-
28-
QFile file(filename.c_str());
29-
if (!file.open(QFile::ReadOnly | QFile::Text)) {
30-
assert(false);
31-
return;
32-
}
33-
34-
QTextStream f(&file);
35-
QString line;
36-
37-
QRegExp spaces("\\s+");
38-
do {
39-
line = f.readLine().trimmed();
40-
QStringList parts = line.split(spaces);
41-
if (parts.isEmpty()) continue;
42-
if (parts[0] == "v" && parts.count() >= 4) {
43-
float x = parts[1].toFloat();
44-
float y = parts[2].toFloat();
45-
float z = parts[3].toFloat();
46-
SimpleVertex v;
47-
v.position = {x, y, z};
48-
vertexBuffer.push_back(v);
49-
}
50-
else if (parts[0] == "vn" && parts.count() >= 4) {
51-
float x = parts[1].toFloat();
52-
float y = parts[2].toFloat();
53-
float z = parts[3].toFloat();
54-
normals.push_back({x, y, z});
55-
}
56-
else if (parts[0] == "vt" && parts.count() >= 3) {
57-
float u = parts[1].toFloat();
58-
float v = parts[2].toFloat();
59-
uvs.push_back({u, v});
60-
}
61-
else if (parts[0] == "f" && parts.count() >= 4) {
62-
for (int i = 1; i <= 3; i++) {
63-
QStringList subparts = parts[i].split('/');
64-
int vertex = subparts.count() > 0 ? subparts[0].toInt() - 1 : -1;
65-
int uv = subparts.count() > 1 ? subparts[1].toInt() - 1 : -1;
66-
int normal = subparts.count() > 2 ? subparts[2].toInt() - 1 : -1;
67-
indexBuffer.push_back(vertex);
68-
SimpleVertex& v = vertexBuffer[vertex];
69-
if (normal != -1) {
70-
v.normal += normals[normal];
71-
}
72-
if (uv != -1) {
73-
v.uv = uvs[uv];
74-
}
75-
}
76-
}
77-
} while (!line.isNull());
78-
79-
for (SimpleVertex& v : vertexBuffer) {
80-
v.normal.normalize();
81-
}
82-
83-
VertexBufferDesc desc;
84-
desc.bufferData = vertexBuffer.data();
85-
desc.bufferSize = vertexBuffer.size() * sizeof(SimpleVertex);
86-
desc.vertexElementSizes = {3, 3, 2};
87-
desc.stride = sizeof(SimpleVertex);
88-
89-
setVertexBuffer(desc, PrimitiveType::Triangles);
90-
setIndexBuffer(indexBuffer);
91-
}
92-
9317
void Mesh::render() const
9418
{
9519
assert(vertexArrayObject_ > 0 && vertexBufferObject_ > 0);

src/mesh.h

-2
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,6 @@ class Mesh
3535
Mesh();
3636
~Mesh();
3737

38-
void load(string name);
39-
4038
void render() const;
4139

4240
// Mesh doesn't own vertex buffer and index buffer, callers are responsible for releasing them

src/meshcache.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "meshcache.h"
2+
#include "meshutility.h"
23
#include "mesh.h"
34

45
static MeshCache* g_instance = NULL;
@@ -21,8 +22,9 @@ Mesh *MeshCache::acquire(string name)
2122

2223
string filename = string("models/") + name + ".obj";
2324

24-
p = new Mesh;
25-
p->load(filename);
25+
p = MeshUtility::loadObjModel(filename);
26+
27+
assert(p);
2628

2729
addResource(name, p);
2830

src/meshutility.cpp

+83
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
#include "meshutility.h"
2+
#include <QFile>
3+
#include <QTextStream>
4+
#include <QRegExp>
5+
#include <QStringList>
6+
#include "mesh.h"
7+
8+
Mesh *MeshUtility::loadObjModel(string filename)
9+
{
10+
vector<SimpleVertex> vertexBuffer;
11+
IndexBuffer indexBuffer;
12+
13+
vector<vec3> normals;
14+
vector<vec2> uvs;
15+
16+
QFile file(filename.c_str());
17+
if (!file.open(QFile::ReadOnly | QFile::Text)) {
18+
assert(false);
19+
return NULL;
20+
}
21+
22+
QTextStream f(&file);
23+
QString line;
24+
25+
QRegExp spaces("\\s+");
26+
do {
27+
line = f.readLine().trimmed();
28+
QStringList parts = line.split(spaces);
29+
if (parts.isEmpty()) continue;
30+
if (parts[0] == "v" && parts.count() >= 4) {
31+
float x = parts[1].toFloat();
32+
float y = parts[2].toFloat();
33+
float z = parts[3].toFloat();
34+
SimpleVertex v;
35+
v.position = {x, y, z};
36+
vertexBuffer.push_back(v);
37+
}
38+
else if (parts[0] == "vn" && parts.count() >= 4) {
39+
float x = parts[1].toFloat();
40+
float y = parts[2].toFloat();
41+
float z = parts[3].toFloat();
42+
normals.push_back({x, y, z});
43+
}
44+
else if (parts[0] == "vt" && parts.count() >= 3) {
45+
float u = parts[1].toFloat();
46+
float v = parts[2].toFloat();
47+
uvs.push_back({u, v});
48+
}
49+
else if (parts[0] == "f" && parts.count() >= 4) {
50+
for (int i = 1; i <= 3; i++) {
51+
QStringList subparts = parts[i].split('/');
52+
int vertex = subparts.count() > 0 ? subparts[0].toInt() - 1 : -1;
53+
int uv = subparts.count() > 1 ? subparts[1].toInt() - 1 : -1;
54+
int normal = subparts.count() > 2 ? subparts[2].toInt() - 1 : -1;
55+
indexBuffer.push_back(vertex);
56+
SimpleVertex& v = vertexBuffer[vertex];
57+
if (normal != -1) {
58+
v.normal += normals[normal];
59+
}
60+
if (uv != -1) {
61+
v.uv = uvs[uv];
62+
}
63+
}
64+
}
65+
} while (!line.isNull());
66+
67+
for (SimpleVertex& v : vertexBuffer) {
68+
v.normal.normalize();
69+
}
70+
71+
Mesh* mesh = new Mesh;
72+
73+
VertexBufferDesc desc;
74+
desc.bufferData = vertexBuffer.data();
75+
desc.bufferSize = vertexBuffer.size() * sizeof(SimpleVertex);
76+
desc.vertexElementSizes = {3, 3, 2};
77+
desc.stride = sizeof(SimpleVertex);
78+
79+
mesh->setVertexBuffer(desc, PrimitiveType::Triangles);
80+
mesh->setIndexBuffer(indexBuffer);
81+
82+
return mesh;
83+
}

src/meshutility.h

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#ifndef MESHUTILITY_H
2+
#define MESHUTILITY_H
3+
4+
#include "common.h"
5+
6+
class MeshUtility
7+
{
8+
public:
9+
static Mesh* loadObjModel(string filename);
10+
};
11+
12+
#endif // MESHUTILITY_H

src/scene.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ Scene::~Scene()
2626
delete object;
2727
}
2828

29-
//delete skybox_;
29+
delete skybox_;
3030
}
3131

3232
void Scene::initialize()
@@ -70,8 +70,6 @@ void Scene::initialize()
7070

7171
sceneObjects_.push_back(obj2);
7272

73-
//
74-
7573
// Lights owned by the scene
7674
DirectLight* light = new DirectLight({-1, -0.5, -1}, {1.0, 1.0, 1.0});
7775
lights_.push_back(light);
@@ -84,6 +82,8 @@ void Scene::initialize()
8482
particleMaterial->setTexture(tornadoMap);
8583
particleSystem->setMaterial(particleMaterial);
8684

85+
particleSystem->transform().translate(0, 10, 0);
86+
8787
sceneObjects_.push_back(particleSystem);
8888

8989
// Skybox

src/shader.cpp

-2
This file was deleted.

src/terrain.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#include "terrain.h"
2+
3+
Terrain::Terrain()
4+
{
5+
}

src/terrain.h

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#ifndef TERRAIN_H
2+
#define TERRAIN_H
3+
4+
#include "sceneobject.h"
5+
6+
class Terrain : public SceneObject
7+
{
8+
public:
9+
Terrain();
10+
11+
private:
12+
void buildMesh() {}
13+
};
14+
15+
#endif // TERRAIN_H

0 commit comments

Comments
 (0)