-
Notifications
You must be signed in to change notification settings - Fork 1
/
Picture.cpp
95 lines (75 loc) · 2.88 KB
/
Picture.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
84
85
86
87
88
89
90
91
92
93
94
95
#include "Picture.h"
#include "Maze3D.h"
#include "maze3dflyer.h"
// Draw a quad for picture. Do not use within glBegin/End (e.g. of QUADS)
void Picture::draw(void) {
//##TODO: would like to have a "frame" behind the pic.
switch (dir) {
case 'x': glNormal3f(wall->outsidePositive ? 1.0f : -1.0f, 0.0f, 0.0f); break;
case 'y': glNormal3f(0.0f, wall->outsidePositive ? 1.0f : -1.0f, 0.0f); break;
case 'z': glNormal3f(0.0f, 0.0f, wall->outsidePositive ? 1.0f : -1.0f); break;
default: errorMsg("Invalid dir in Picture::draw()\n");
}
Vertex *qv = frameQuad.vertices;
glColor3f(0.0f, 0.0f, 0.0f); // black
// no texture
glBindTexture(GL_TEXTURE_2D, GL_NONE);
glBegin(GL_QUADS);
for (int i=0; i < 4; i++) {
glTexCoord2f(qv[i].u, qv[i].v); glVertex3f(qv[i].x, qv[i].y, qv[i].z);
}
glEnd();
qv = quad.vertices;
glColor3f(1.0f, 1.0f, 1.0f); // white
// picture texture
glBindTexture(GL_TEXTURE_2D, image->textureId);
glBegin(GL_QUADS);
for (int i=0; i < 4; i++) {
glTexCoord2f(qv[i].u, qv[i].v); glVertex3f(qv[i].x, qv[i].y, qv[i].z);
}
glEnd();
}
void Picture::setupVertices(void) {
GLfloat ep = 0.001; // epsilon
//##TODO generalize to all directions
Vertex *qv = quad.vertices;
//##TODO: refactor this stuff out into a function call
// Copy all vertex coords for starters; then change some.
quad = wall->quad; // This is not just a copy-by-reference!
for (int i = 0; i < 4; i++) {
// wv = &(wall->quad.vertices[i]);
qv[i].x -= ep;
}
float top = 0.9f, bottom = 0.3f, side = 0.2f, minorAxis;
// adjust this based on aspect ratio of the image
if (image->width > image->height) {
minorAxis = 0.6f * image->height / image->width;
top = 0.6f + minorAxis * 0.5f;
bottom = 0.6f - minorAxis * 0.5f;
} else {
minorAxis = 0.6f * image->width / image->height;
side = 0.5f - minorAxis * 0.5f;
}
// set bottom and top of picture
qv[0].y = qv[1].y = (where.y + bottom) * Maze3D::cellSize;
qv[2].y = qv[3].y = (where.y + top) * Maze3D::cellSize;
// sides
qv[0].z = qv[3].z = (where.z + side) * Maze3D::cellSize;
qv[1].z = qv[2].z = (where.z + 1.0 - side) * Maze3D::cellSize;
frameQuad = wall->quad; // deep copy
qv = frameQuad.vertices;
for (int i = 0; i < 4; i++) {
// wv = &(wall->quad.vertices[i]);
qv[i].x -= ep / 2.0;
}
top += 0.025f;
bottom -= 0.025f;
side -= 0.025f;
// set bottom and top of picture
qv[0].y = qv[1].y = (where.y + bottom) * Maze3D::cellSize;
qv[2].y = qv[3].y = (where.y + top) * Maze3D::cellSize;
// sides
qv[0].z = qv[3].z = (where.z + side) * Maze3D::cellSize;
qv[1].z = qv[2].z = (where.z + 1.0 - side) * Maze3D::cellSize;
//##TODO: rotate quads around center to desired direction
}