This repository has been archived by the owner on Oct 5, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbox.cpp
83 lines (72 loc) · 3.25 KB
/
box.cpp
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
#include "box.h"
#include <QVector2D>
#include <QVector3D>
Box :: Box(float w, float h, float l)
: width (w)
, height (h)
, length (l)
{
initializeOpenGLFunctions();
initGeometry();
}
void Box::initGeometry()
{
float hw = width / 2, hh = height / 2, hl = length / 2;
// For cube we would need only 8 vertices but we have to
// duplicate vertex for each face because texture coordinate
// is different.
VertexData vertices [] = {
// Vertex data for face 0
{QVector3D(-hw, -hh, hl), QVector2D(.0f, .0f)}, // v0
{QVector3D( hw, -hh, hl), QVector2D(.33f, .0f)}, // v1
{QVector3D(-hw, hh, hl), QVector2D(.0f, .5f)}, // v2
{QVector3D( hw, hh, hl), QVector2D(.33f, .5f)}, // v3
// Vertex data for face 1
{QVector3D( hw, -hh, hl), QVector2D(.0f, .5f)}, // v4
{QVector3D( hw, -hh, -hl), QVector2D(.33f, .5f)}, // v5
{QVector3D( hw, hh, hl), QVector2D(.0f, 1.0f)}, // v6
{QVector3D( hw, hh, -hl), QVector2D(.33f, 1.0f)}, // v7
// Vertex data for face 2
{QVector3D( hw, -hh, -hl), QVector2D(.66f, .5f)}, // v8
{QVector3D(-hw, -hh, -hl), QVector2D(1.0f, .5f)}, // v9
{QVector3D( hw, hh, -hl), QVector2D(.66f, 1.0f)}, // v10
{QVector3D(-hw, hh, -hl), QVector2D(1.0f, 1.0f)}, // v11
// Vertex data for face 3
{QVector3D(-hw, -hh, -hl), QVector2D(.66f, .0f)}, // v12
{QVector3D(-hw, -hh, hl), QVector2D(1.0f, .0f)}, // v13
{QVector3D(-hw, hh, -hl), QVector2D(.66f, .5f)}, // v14
{QVector3D(-hw, hh, hl), QVector2D(1.0f, .5f)}, // v15
// Vertex data for face 4
{QVector3D(-hw, -hh, -hl), QVector2D(.33f, .0f)}, // v16
{QVector3D( hw, -hh, -hl), QVector2D(.66f, .0f)}, // v17
{QVector3D(-hw, -hh, hl), QVector2D(.33f, .5f)}, // v18
{QVector3D( hw, -hh, hl), QVector2D(.66f, .5f)}, // v19
// Vertex data for face 5
{QVector3D(-hw, hh, hl), QVector2D(.33f, .5f)}, // v20
{QVector3D( hw, hh, hl), QVector2D(.66f, .5f)}, // v21
{QVector3D(-hw, hh, -hl), QVector2D(.33f, 1.0f)}, // v22
{QVector3D( hw, hh, -hl), QVector2D(.66f, 1.0f)} // v23
};
// Indices for drawing cube faces using triangle strips.
// Triangle strips can be connected by duplicating indices
// between the strips. If connecting strips have opposite
// vertex order then last index of the first strip and first
// index of the second strip needs to be duplicated. If
// connecting strips have same vertex order then only last
// index of the first strip needs to be duplicated.
Geometry::indicetype_t indices [] = {
0, 1, 2, 3, 3 // Face 0 - triangle strip ( v0, v1, v2, v3)
, 4, 4, 5, 6, 7, 7 // Face 1 - triangle strip ( v4, v5, v6, v7)
, 8, 8, 9, 10, 11, 11 // Face 2 - triangle strip ( v8, v9, v10, v11)
, 12, 12, 13, 14, 15, 15 // Face 3 - triangle strip (v12, v13, v14, v15)
, 16, 16, 17, 18, 19, 19 // Face 4 - triangle strip (v16, v17, v18, v19)
, 20, 20, 21, 22, 23 // Face 5 - triangle strip (v20, v21, v22, v23)
};
// Transfer vertex data to VBO 0
geometry.vertices.bind ();
geometry.vertices.allocate (vertices , sizeof (vertices));
// Transfer index data to VBO 1
geometry.indices.bind ();
// geometry.indices.allocate (indices, sizeof (indices) * 2);
geometry.indices.allocate (indices, sizeof (indices));
}