GeometryEngine.cpp 5.68 KB
Newer Older
1
#include "..\Header\GeometryEngine.h"
Anakin's avatar
Anakin committed
2
#include "..\Header\MshFile.h"
3

Anakin's avatar
Anakin committed
4 5 6 7

/////////////////////////////////////////////////////////////////////////
// public constructor/destructor

8
GeometryEngine::GeometryEngine()
Anakin's avatar
Anakin committed
9
	: m_indexBuf(QOpenGLBuffer::IndexBuffer)
10
{
Anakin's avatar
Anakin committed
11
	initializeOpenGLFunctions();
12

Anakin's avatar
Anakin committed
13
	// Generate 2 VBOs
Anakin's avatar
Anakin committed
14 15
	m_arrayBuf.create();
	m_indexBuf.create();
16

Anakin's avatar
Anakin committed
17 18
	// Initializes cube geometry and transfers it to VBOs
	initCubeGeometry();
19 20 21 22
}

GeometryEngine::~GeometryEngine()
{
Anakin's avatar
Anakin committed
23 24 25 26 27 28 29
	m_arrayBuf.destroy();
	m_indexBuf.destroy();

	for (auto it : m_textures)
		delete it;
	m_textures.clear();
	m_textures.squeeze();
30 31
}

Anakin's avatar
Anakin committed
32 33 34 35

/////////////////////////////////////////////////////////////////////////
// private functions

36 37
void GeometryEngine::initCubeGeometry()
{
Anakin's avatar
Anakin committed
38

Anakin's avatar
Anakin committed
39 40 41 42 43 44 45 46 47 48 49 50 51
	try
	{
		MshFile file("..\\Release\\Msh\\cube.msh");
		m_models = file.getModels();
		//TODO use models local, apply MVP directly to the vertex, save size and tex index info

		//TODO: handle the textures
	}
	catch (std::invalid_argument e)
	{
		//TODO: make a cool message box
		auto msg = e.what();
	}
52

Anakin's avatar
Anakin committed
53 54
	// Transfer vertex data to VBO 0
	m_arrayBuf.bind();
Anakin's avatar
Anakin committed
55
	m_arrayBuf.allocate(m_models->first()->segmList.front()->vertices.data(), m_models->first()->segmList.front()->vertices.size() * sizeof(VertexData));
56

Anakin's avatar
Anakin committed
57 58
	// Transfer index data to VBO 1
	m_indexBuf.bind();
Anakin's avatar
Anakin committed
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
	m_indexBuf.allocate(m_models->first()->segmList.front()->indices.data(), m_models->first()->segmList.front()->indices.size() * sizeof(GLushort));


	//QVector<VertexData> vertices = {
 //       // Vertex data for face 0
 //       {QVector3D(-1.0f, -1.0f,  1.0f), QVector2D(0.0f, 0.0f)},  // v0
 //       {QVector3D( 1.0f, -1.0f,  1.0f), QVector2D(0.33f, 0.0f)}, // v1
 //       {QVector3D(-1.0f,  1.0f,  1.0f), QVector2D(0.0f, 0.5f)},  // v2
 //       {QVector3D( 1.0f,  1.0f,  1.0f), QVector2D(0.33f, 0.5f)}, // v3

 //       // Vertex data for face 1
 //       {QVector3D( 1.0f, -1.0f,  1.0f), QVector2D( 0.0f, 0.5f)}, // v4
 //       {QVector3D( 1.0f, -1.0f, -1.0f), QVector2D(0.33f, 0.5f)}, // v5
 //       {QVector3D( 1.0f,  1.0f,  1.0f), QVector2D(0.0f, 1.0f)},  // v6
 //       {QVector3D( 1.0f,  1.0f, -1.0f), QVector2D(0.33f, 1.0f)}, // v7

 //       // Vertex data for face 2
 //       {QVector3D( 1.0f, -1.0f, -1.0f), QVector2D(0.66f, 0.5f)}, // v8
 //       {QVector3D(-1.0f, -1.0f, -1.0f), QVector2D(1.0f, 0.5f)},  // v9
 //       {QVector3D( 1.0f,  1.0f, -1.0f), QVector2D(0.66f, 1.0f)}, // v10
 //       {QVector3D(-1.0f,  1.0f, -1.0f), QVector2D(1.0f, 1.0f)},  // v11

 //       // Vertex data for face 3
 //       {QVector3D(-1.0f, -1.0f, -1.0f), QVector2D(0.66f, 0.0f)}, // v12
 //       {QVector3D(-1.0f, -1.0f,  1.0f), QVector2D(1.0f, 0.0f)},  // v13
 //       {QVector3D(-1.0f,  1.0f, -1.0f), QVector2D(0.66f, 0.5f)}, // v14
 //       {QVector3D(-1.0f,  1.0f,  1.0f), QVector2D(1.0f, 0.5f)},  // v15

 //       // Vertex data for face 4
 //       {QVector3D(-1.0f, -1.0f, -1.0f), QVector2D(0.33f, 0.0f)}, // v16
 //       {QVector3D( 1.0f, -1.0f, -1.0f), QVector2D(0.66f, 0.0f)}, // v17
 //       {QVector3D(-1.0f, -1.0f,  1.0f), QVector2D(0.33f, 0.5f)}, // v18
 //       {QVector3D( 1.0f, -1.0f,  1.0f), QVector2D(0.66f, 0.5f)}, // v19

 //       // Vertex data for face 5
 //       {QVector3D(-1.0f,  1.0f,  1.0f), QVector2D(0.33f, 0.5f)}, // v20
 //       {QVector3D( 1.0f,  1.0f,  1.0f), QVector2D(0.66f, 0.5f)}, // v21
 //       {QVector3D(-1.0f,  1.0f, -1.0f), QVector2D(0.33f, 1.0f)}, // v22
 //       {QVector3D( 1.0f,  1.0f, -1.0f), QVector2D(0.66f, 1.0f)}  // v23
 //   };

	//QVector<GLushort> indices = {
	//	0,1,2,		//vorne (4)
	//	3,2,1,
	//	4,5,7,		//rechts (1)
	//	6,4,7,
	//	8,9,11,		//hinten (3)*
	//	8,11,10,
	//	14,12,13,	//links (6)*
	//	14,13,15,
	//	18,16,17,	//unten (5)
	//	19,18,17,
	//	23,22,20,	//oben (2)*
	//	23,20,21
	//};

	//// Transfer vertex data to VBO 0
	//m_arrayBuf.bind();
	//m_arrayBuf.allocate(vertices.data(), vertices.size() * sizeof(VertexData));

	//// Transfer index data to VBO 1
	//m_indexBuf.bind();
	//m_indexBuf.allocate(indices.data(), indices.size() * sizeof(GLushort));
Anakin's avatar
Anakin committed
122

Anakin's avatar
Anakin committed
123
	// load the texture
Anakin's avatar
Anakin committed
124
	initTexture();
125 126
}

Anakin's avatar
Anakin committed
127
void GeometryEngine::initTexture()
128
{
Anakin's avatar
Anakin committed
129
	// Load cube.png image
Anakin's avatar
Anakin committed
130
	QOpenGLTexture* new_texture = new QOpenGLTexture(QImage(":images/cube.png").mirrored());
Anakin's avatar
Anakin committed
131 132

	// Set nearest filtering mode for texture minification
Anakin's avatar
Anakin committed
133
	new_texture->setMinificationFilter(QOpenGLTexture::Nearest);
Anakin's avatar
Anakin committed
134 135

	// Set bilinear filtering mode for texture magnification
Anakin's avatar
Anakin committed
136
	new_texture->setMagnificationFilter(QOpenGLTexture::Linear);
Anakin's avatar
Anakin committed
137 138 139

	// Wrap texture coordinates by repeating
	// f.ex. texture coordinate (1.1, 1.2) is same as (0.1, 0.2)
Anakin's avatar
Anakin committed
140 141 142
	new_texture->setWrapMode(QOpenGLTexture::Repeat);

	m_textures.push_back(new_texture);
Anakin's avatar
Anakin committed
143 144
}

Anakin's avatar
Anakin committed
145 146 147 148

/////////////////////////////////////////////////////////////////////////
// public functions

Anakin's avatar
Anakin committed
149 150 151
void GeometryEngine::drawGeometry(QOpenGLShaderProgram *program)
{
	// Tell OpenGL which VBOs to use
Anakin's avatar
Anakin committed
152 153 154
	m_arrayBuf.bind();
	m_indexBuf.bind();
	m_textures.first()->bind();
Anakin's avatar
Anakin committed
155 156 157

	// Use texture unit 0 which contains cube.png
	program->setUniformValue("texture", 0);
158

Anakin's avatar
Anakin committed
159 160
	// Offset for position
	quintptr offset = 0;
161

Anakin's avatar
Anakin committed
162 163 164 165
	// Tell OpenGL programmable pipeline how to locate vertex position data
	int vertexLocation = program->attributeLocation("a_position");
	program->enableAttributeArray(vertexLocation);
	program->setAttributeBuffer(vertexLocation, GL_FLOAT, offset, 3, sizeof(VertexData));
166

Anakin's avatar
Anakin committed
167 168
	// Offset for texture coordinate
	offset += sizeof(QVector3D);
169

Anakin's avatar
Anakin committed
170 171 172 173
	// Tell OpenGL programmable pipeline how to locate vertex texture coordinate data
	int texcoordLocation = program->attributeLocation("a_texcoord");
	program->enableAttributeArray(texcoordLocation);
	program->setAttributeBuffer(texcoordLocation, GL_FLOAT, offset, 2, sizeof(VertexData));
174

Anakin's avatar
Anakin committed
175 176
	// Draw cube geometry using indices from VBO 1
	glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, 0);
177
}