-
Notifications
You must be signed in to change notification settings - Fork 0
/
Wall.cpp
81 lines (68 loc) · 2.73 KB
/
Wall.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
#include "Wall.h"
#include "World.h"
Wall::Wall(GLuint program, GLuint texture, float x, float y, float z) : BaseObject(program, x, y, z) {
this->index = 0;
this->texture = texture;
//Create a cube with 6 faces
quad(0, 1, 5, 4, vec3(0.0, 0.0, 1.0)); // Front
quad(1, 2, 6, 5, vec3(1.0, 0.0, 0.0)); // Right
quad(2, 3, 7, 6, vec3(0.0, 0.0, -1.0)); // Back
quad(3, 0, 4, 7, vec3(-1.0, 0.0, 0.0)); // Left
quad(4, 5, 6, 7, vec3(0.0, 1.0, 0.0)); // Top
quad(3, 2, 1, 0, vec3(0.0, -1.0, 0.0)); // Bottom
for (int i = 0; i < numVertices; i++) {
this->vertices.push_back(points[i]);
this->normals.push_back(normal_pts[i]);
this->textures.push_back(tex_coords[i]);
}
}
/**
* Create a square
*/
void Wall::quad(int a, int b, int c, int d, vec3 normal) {
float x = position.x;
float y = position.y;
float z = position.z;
vec4 vertices[8] = {
vec4(x - World::cellSize / 2, y - HEIGHT / 2, z + World::cellSize / 2, 1.0),
vec4(x + World::cellSize / 2, y - HEIGHT / 2, z + World::cellSize / 2, 1.0),
vec4(x + World::cellSize / 2, y - HEIGHT / 2, z - World::cellSize / 2, 1.0),
vec4(x - World::cellSize / 2, y - HEIGHT / 2, z - World::cellSize / 2, 1.0),
vec4(x - World::cellSize / 2, y + HEIGHT / 2, z + World::cellSize / 2, 1.0),
vec4(x + World::cellSize / 2, y + HEIGHT / 2, z + World::cellSize / 2, 1.0),
vec4(x + World::cellSize / 2, y + HEIGHT / 2, z - World::cellSize / 2, 1.0),
vec4(x - World::cellSize / 2, y + HEIGHT / 2, z - World::cellSize / 2, 1.0)
};
normal_pts[index] = normal;
points[index] = vertices[a];
tex_coords[index++] = vec2(0.0, 0.0);
normal_pts[index] = normal;
points[index] = vertices[b];
tex_coords[index++] = vec2(0.0, 1.0);
normal_pts[index] = normal;
points[index] = vertices[c];
tex_coords[index++] = vec2(1.0, 1.0);
normal_pts[index] = normal;
points[index] = vertices[a];
tex_coords[index++] = vec2(0.0, 0.0);
normal_pts[index] = normal;
points[index] = vertices[c];
tex_coords[index++] = vec2(1.0, 1.0);
normal_pts[index] = normal;
points[index] = vertices[d];
tex_coords[index++] = vec2(1.0, 0.0);
}
/**
* Render the object
*/
void Wall::draw(GLuint Model) {
glUniform4fv(glGetUniformLocation(program, "AmbientProduct"), 1, World::light_ambient);
glUniform4fv(glGetUniformLocation(program, "DiffuseProduct"), 1, World::light_diffuse);
glUniform4fv(glGetUniformLocation(program, "SpecularProduct"), 1, World::light_specular);
glUniform1f(glGetUniformLocation(program, "Shininess"), material_shininess);
glUniform1i(glGetUniformLocation(program, "UseColor"), 0);
glBindVertexArray(this->vao);
glBindTexture(GL_TEXTURE_2D, texture);
glUniformMatrix4fv(Model, 1, GL_TRUE, this->model);
glDrawArrays(GL_TRIANGLES, 0, this->numVertices);
}