-
Notifications
You must be signed in to change notification settings - Fork 0
/
Main.cpp
211 lines (168 loc) · 6.25 KB
/
Main.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
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
#include "Scene.h"
#include "Camera.h"
#include "MyThreeBody.h"
#define GLEW_STATIC
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
void initialize(int width, int height, string title);
void keyboardControl(GLFWwindow* window, int key, int scancode, int action, int mode);
void mouseControl(GLFWwindow* window, double xpos, double ypos);
void processKeyPress();
GLuint windowWidth = 1920;
GLuint windowHeight = 1080;
GLFWwindow* window;
Camera camera(glm::vec3(0.0f, 0.0f, 0.0f));
bool keyPress[1024];
bool isMouseInit = true;
GLfloat mouseCoordinateX = 400, mouseCoordinateY = 300;
GLfloat deltaTime = 0.0f;
GLfloat lastFrame = 0.0f;
typedef struct
{
glm::vec3 position;
glm::vec3 color;
}Light;
Light lightSource;
MyThreeBody tb = MyThreeBody();
int main()
{
initialize(windowWidth, windowHeight, "CG Project");
tb.reset();
Planet& p1 = tb.getPlanetA();
Planet& p2 = tb.getPlanetB();
Planet& p3 = tb.getPlanetC();
// Scene ID Variables
GLuint sun, rockPlanet, metalPlanet, background;
// Scenes
Scene sunScene(".\\model\\sun\\sun.obj", sun);
sunScene.setModel(sun, true, glm::vec3(0, 0, 0), glm::vec3(0.5, 0.5, 0.5), glm::vec3(0.0, 0.0, 1.0));
Scene rockScene(".\\model\\rock\\rock.obj", rockPlanet);
rockScene.setModel(rockPlanet, true, glm::vec3(0, 0, 0), glm::vec3(0.5, 0.5, 0.5), glm::vec3(0.0, 1.0, 0.0));
Scene metalScene(".\\model\\metal\\metal.obj", metalPlanet);
metalScene.setModel(metalPlanet, true, glm::vec3(0, 0, 0), glm::vec3(0.1, 0.1, 0.1), glm::vec3(1.0, 0.0, 0.0));
Scene backgroundScene(".\\model\\background\\background.obj", background);
backgroundScene.setModel(background, true, glm::vec3(0, 0, 0), glm::vec3(500, 500, 500), glm::vec3(0.0, 0.0, 1.0));
// Shaders
Shader shader("./shader/defaultshader.vs", "./shader/defaultshader.fs", SHADER_FROM_FILE);
// Point of Light
lightSource.position = glm::vec3(0.0, 0.0, 0.0);
lightSource.color = glm::vec3(1, 1, 1);
float radians = 0.0f;
//------Main Loop------//
while (!glfwWindowShouldClose(window))
{
GLfloat currentFrameTime = (GLfloat)glfwGetTime();
deltaTime = currentFrameTime - lastFrame;
lastFrame = currentFrameTime;
// Check and call events
glfwPollEvents();
processKeyPress();
// Clear the colorbuffer
glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// use shader
shader.Use();
// View and projection matrix setup
glViewport(0, 0, windowWidth, windowHeight);
glm::mat4 projection = glm::perspective(camera.zoom, (float)windowWidth / (float)windowHeight, 1.0f, 10000.0f);
glm::mat4 view = camera.getViewMatrix();
glm::mat4 VPMatrix = projection * view;
glUniformMatrix4fv(glGetUniformLocation(shader.Program, "VPMatrix"), 1, GL_FALSE, glm::value_ptr(VPMatrix));
lightSource.position.x = p1.planetCoordinate.x;
lightSource.position.y = p1.planetCoordinate.y;
lightSource.position.z = p1.planetCoordinate.z;
// Setup Light
glUniform3fv(glGetUniformLocation(shader.Program, "LightPos"), 1, glm::value_ptr(lightSource.position));
glUniform3fv(glGetUniformLocation(shader.Program, "LightColor"), 1, glm::value_ptr(lightSource.color));
// Draw using default shader
tb.update(0.02);
sunScene.setModel(sun, true, glm::vec3(p1.planetCoordinate.x, p1.planetCoordinate.y, p1.planetCoordinate.z), glm::vec3(0.5, 0.5, 0.5), glm::vec3(0.0, 0.0, 1.0));
sunScene.Draw(shader, radians);
rockScene.setModel(rockPlanet, true, glm::vec3(p2.planetCoordinate.x, p2.planetCoordinate.y, p2.planetCoordinate.z), glm::vec3(1.6, 1.6, 1.6), glm::vec3(0.0, 1.0, 0.0));
rockScene.Draw(shader, radians);
metalScene.setModel(metalPlanet, true, glm::vec3(p3.planetCoordinate.x, p3.planetCoordinate.y, p3.planetCoordinate.z), glm::vec3(0.3, 0.3, 0.3), glm::vec3(1.0, 0.0, 0.0));
metalScene.Draw(shader, radians);
backgroundScene.Draw(shader, 0.0f);
radians += 0.5f;
glfwSwapBuffers(window);
}
return 0;
}
void initialize(int width, int height, string title)
{
//------GLFW Initiation------//
if (glfwInit() == false) {
cerr << "ERROR: GLFW initialization failed! -- (glfwinit)" << endl;
system("PAUSE");
glfwTerminate();
}
glfwWindowHint(GLFW_SAMPLES, 1);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
//------GLFW Window Creating------//
window = glfwCreateWindow(width, height, title.c_str(), NULL, NULL);
if (window == NULL)
{
cerr << "ERROR: Main window creation failed! -- (glfwCreateWindow)" << endl;
system("PAUSE");
glfwTerminate();
}
glfwMakeContextCurrent(window);
//------GLFW Options------//
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
glfwSetKeyCallback(window, keyboardControl);
glfwSetCursorPosCallback(window, mouseControl);
//glfwSetScrollCallback(window, scroll_callback);
//enable glew for newer version of open GL
glewExperimental = true;
if (glewInit() != GLEW_OK)
{
cerr << "ERROR: GLEW initialization failed! -- (glewInit)" << endl;
system("PAUSE");
}
//------Viewport Definition------//
glViewport(0, 0, width, height);
glEnable(GL_DEPTH_TEST);
}
// Is called whenever a key is pressed/released via GLFW
void keyboardControl(GLFWwindow* window, int key, int scancode, int action, int mode)
{
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
glfwSetWindowShouldClose(window, GL_TRUE);
if (action == GLFW_PRESS)
keyPress[key] = true;
else if (action == GLFW_RELEASE)
keyPress[key] = false;
}
void mouseControl(GLFWwindow* window, double xpos, double ypos)
{
if (isMouseInit)
{
mouseCoordinateX = (GLfloat)xpos;
mouseCoordinateY = (GLfloat)ypos;
isMouseInit = false;
}
GLfloat xOffset = (GLfloat)(xpos - mouseCoordinateX);
GLfloat yOffset = (GLfloat)(mouseCoordinateY - ypos);
mouseCoordinateX = (GLfloat)xpos;
mouseCoordinateY = (GLfloat)ypos;
camera.processMouse(xOffset, yOffset);
}
void processKeyPress()
{
// Camera controls
if (keyPress[GLFW_KEY_W])
camera.processKeyboard(FORWARD, deltaTime);
if (keyPress[GLFW_KEY_S])
camera.processKeyboard(BACKWARD, deltaTime);
if (keyPress[GLFW_KEY_A])
camera.processKeyboard(LEFT, deltaTime);
if (keyPress[GLFW_KEY_D])
camera.processKeyboard(RIGHT, deltaTime);
if (keyPress[GLFW_KEY_R])
tb.reset();
}