-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathresourceloader.cpp
More file actions
executable file
·142 lines (118 loc) · 4.9 KB
/
Copy pathresourceloader.cpp
File metadata and controls
executable file
·142 lines (118 loc) · 4.9 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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include "resourceloader.h"
#include <QGLShaderProgram>
#include <QList>
#include <QString>
#include "glm.h"
/**
Loads the cube map into video memory.
@param files: a list of files containing the cube map images (should be length
six) in order
@return the assigned OpenGL id to the cube map
**/
GLuint ResourceLoader::loadCubeMap(QList<QFile *> files)
{
Q_ASSERT(files.length() == 6);
// Generate an ID
GLuint id;
glGenTextures(1, &id);
// Bind the texture
glBindTexture(GL_TEXTURE_CUBE_MAP, id);
// Load and build mipmaps for each image
for (int i = 0; i < 6; ++i)
{
QImage image, texture;
image.load(files[i]->fileName());
image = image.mirrored(false, true);
texture = QGLWidget::convertToGLFormat(image);
texture = texture.scaledToWidth(1024, Qt::SmoothTransformation);
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 3, 3, texture.width(), texture.height(), 0, GL_RGBA,GL_UNSIGNED_BYTE, texture.bits());
gluBuild2DMipmaps(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 3, texture.width(), texture.height(), GL_RGBA, GL_UNSIGNED_BYTE, texture.bits());
}
// Set filter when pixel occupies more than one texture element
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
// Set filter when pixel smaller than one texture element
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// Unbind the texture
glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
return id;
}
/**
Loads an OBJ models from a file
**/
Model ResourceLoader::loadObjModel(QString filePath)
{
Model m;
m.model = glmReadOBJ(filePath.toStdString().c_str());
glmUnitize(m.model);
m.idx = glmList(m.model, GLM_SMOOTH);
return m;
}
/**
Creates a call list for a skybox
**/
GLuint ResourceLoader::loadSkybox()
{
GLuint id = glGenLists(1);
glNewList(id, GL_COMPILE);
// Be glad we wrote this for you...ugh.
glBegin(GL_QUADS);
float extent = 10000.f;
glTexCoord3f( 1.0f, 1.0f, -1.0f); glVertex3f( extent, extent, -extent);
glTexCoord3f(-1.0f, 1.0f, -1.0f); glVertex3f(-extent, extent, -extent);
glTexCoord3f(-1.0f, -1.0f, -1.0f); glVertex3f(-extent, -extent, -extent);
glTexCoord3f( 1.0f, -1.0f, -1.0f); glVertex3f( extent, -extent, -extent);
glTexCoord3f( 1.0f, 1.0f, 1.0f); glVertex3f( extent, extent, extent);
glTexCoord3f( 1.0f, 1.0f, -1.0f); glVertex3f( extent, extent, -extent);
glTexCoord3f( 1.0f, -1.0f, -1.0f); glVertex3f( extent, -extent, -extent);
glTexCoord3f( 1.0f, -1.0f, 1.0f); glVertex3f( extent, -extent, extent);
glTexCoord3f(-1.0f, 1.0f, 1.0f); glVertex3f(-extent, extent, extent);
glTexCoord3f( 1.0f, 1.0f, 1.0f); glVertex3f( extent, extent, extent);
glTexCoord3f( 1.0f, -1.0f, 1.0f); glVertex3f( extent, -extent, extent);
glTexCoord3f(-1.0f, -1.0f, 1.0f); glVertex3f(-extent, -extent, extent);
glTexCoord3f(-1.0f, 1.0f, -1.0f); glVertex3f(-extent, extent, -extent);
glTexCoord3f(-1.0f, 1.0f, 1.0f); glVertex3f(-extent, extent, extent);
glTexCoord3f(-1.0f, -1.0f, 1.0f); glVertex3f(-extent, -extent, extent);
glTexCoord3f(-1.0f, -1.0f, -1.0f); glVertex3f(-extent, -extent, -extent);
glTexCoord3f( 1.0f, 1.0f, -1.0f); glVertex3f( extent, extent, -extent);
glTexCoord3f( 1.0f, 1.0f, 1.0f); glVertex3f( extent, extent, extent);
glTexCoord3f(-1.0f, 1.0f, 1.0f); glVertex3f(-extent, extent, extent);
glTexCoord3f(-1.0f, 1.0f, -1.0f); glVertex3f(-extent, extent, -extent);
glTexCoord3f( 1.0f, -1.0f, -1.0f); glVertex3f( extent, -1, -extent);
glTexCoord3f( 1.0f, -1.0f, 1.0f); glVertex3f( extent, -1, extent);
glTexCoord3f(-1.0f, -1.0f, 1.0f); glVertex3f(-extent, -1, extent);
glTexCoord3f(-1.0f, -1.0f, -1.0f); glVertex3f(-extent, -1, -extent);
glEnd();
glEndList();
return id;
}
/**
Creates a new shader program from a vert shader only
**/
QGLShaderProgram * ResourceLoader::newVertShaderProgram(const QGLContext *context, QString vertShader)
{
QGLShaderProgram *program = new QGLShaderProgram(context);
program->addShaderFromSourceFile(QGLShader::Vertex, vertShader);
program->link();
return program;
}
/**
Creates a new shader program from a frag shader only
**/
QGLShaderProgram * ResourceLoader::newFragShaderProgram(const QGLContext *context, QString fragShader)
{
QGLShaderProgram *program = new QGLShaderProgram(context);
program->addShaderFromSourceFile(QGLShader::Fragment, fragShader);
program->link();
return program;
}
/**
Creates a shader program from both vert and frag shaders
**/
QGLShaderProgram * ResourceLoader::newShaderProgram(const QGLContext *context, QString vertShader, QString fragShader)
{
QGLShaderProgram *program = new QGLShaderProgram(context);
program->addShaderFromSourceFile(QGLShader::Vertex, vertShader);
program->addShaderFromSourceFile(QGLShader::Fragment, fragShader);
program->link();
return program;
}