-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmain.cpp
More file actions
148 lines (129 loc) · 3.76 KB
/
main.cpp
File metadata and controls
148 lines (129 loc) · 3.76 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
143
144
145
146
147
148
#include <stdlib.h>
#include <algorithm>
#include <cassert>
#include <chrono>
#define SDL_MAIN_HANDLED
#include "types/Types.h"
#include "rasterizer/Mesh.h"
#include "rasterizer/Rasterizer.h"
#include "rasterizer/Camera.h"
#include "shaders/FaceIlluminationShader.h"
#include "shaders/GouraudShader.h"
#include "shaders/ClampIlluminationShader.h"
#include "shaders/ZBufferShader.h"
#include "shaders/PhongShader.h"
#include "shaders/TangentNormalShader.h"
void handleInput(SDL_Keycode code, Rasterizer *rasterizer);
int main(int argc, char** argv) {
// Load mesh and its textures
Mesh mesh;
mesh.loadObjFromFile("head.obj");
mesh.loadDiffuseTexture("head_diffuse.png");
mesh.loadNormalMap("head_nm.png");
mesh.loadSpecularMap("head_specular.png");
// Create the camera
Camera camera;
camera.eye = Vector3f{ 0.0f, 0.0f, 3.0f };
camera.center = Vector3f{ 0.0f, 0.0f, 0.0f };
camera.up = Vector3f{ 0.0f, 1.0f, 0.0f };
// Create the rasterizer and setup the transform matrices
Rasterizer rasterizer(&mesh, &camera);
rasterizer.createWindow();
rasterizer.createProjectionMatrix();
rasterizer.createViewportMatrix();
// Create and set the light position in the rasterizer
Vector3f light = Vector3f(0.0f, 0.0f, 1.0f);
rasterizer.setLightPosition(light);
// load shader
std::unique_ptr<Shader> shader = std::unique_ptr<PhongShader>(new PhongShader());
rasterizer.loadShader(shader);
// init offset for camera movement
float cameraOffset = 0.1f;
// timers for FPS counter
std::chrono::time_point<std::chrono::high_resolution_clock> current, previous;
std::chrono::duration<float, std::milli> elapsed(0);
previous = std::chrono::high_resolution_clock::now();
int frames = 1;
SDL_Event event;
bool quit = false;
while (!quit) {
// handle keyboard events
while (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) {
quit = true;
}
if (event.type == SDL_KEYDOWN) {
switch (event.key.keysym.sym) {
case SDLK_ESCAPE:
quit = true;
break;
default:
handleInput(event.key.keysym.sym, &rasterizer);
break;
}
}
}
rasterizer.draw();
// move camera around
camera.eye.x += cameraOffset;
if (camera.eye.x >= 10.0f) {
camera.eye.x -= cameraOffset;
cameraOffset = -cameraOffset;
} else if (camera.eye.x < -10.0f) {
cameraOffset = -cameraOffset;
}
rasterizer.setCamera(&camera);
rasterizer.clearBuffers();
// FPS counter
current = std::chrono::high_resolution_clock::now();
elapsed += std::chrono::duration_cast<std::chrono::duration<float, std::milli>> (current - previous);
previous = current;
frames++;
if (elapsed.count() >= 1000.0f) {
rasterizer.setFpsCount(frames);
elapsed = std::chrono::milliseconds::zero();
frames = 0;
}
}
return 0;
}
void handleInput(SDL_Keycode code, Rasterizer *rasterizer) {
switch (code) {
case SDLK_F1:
{
std::unique_ptr<Shader> shader = std::unique_ptr<PhongShader>(new PhongShader());
rasterizer->loadShader(shader);
}
break;
case SDLK_F2:
{
std::unique_ptr<Shader> shader = std::unique_ptr<GouraudShader>(new GouraudShader());
rasterizer->loadShader(shader);
}
break;
case SDLK_F3:
{
std::unique_ptr<Shader> shader = std::unique_ptr<FaceIlluminationShader>(new FaceIlluminationShader());
rasterizer->loadShader(shader);
}
break;
case SDLK_F4:
{
std::unique_ptr<Shader> shader = std::unique_ptr<ClampIlluminationShader>(new ClampIlluminationShader());
rasterizer->loadShader(shader);
}
break;
case SDLK_F5:
{
std::unique_ptr<Shader> shader = std::unique_ptr<TangentNormalShader>(new TangentNormalShader());
rasterizer->loadShader(shader);
}
break;
case SDLK_F6:
{
std::unique_ptr<Shader> shader = std::unique_ptr<ZBufferShader>(new ZBufferShader());
rasterizer->loadShader(shader);
}
break;
}
}