Add warnings on compile, free movement + camera
This commit is contained in:
parent
540b871c58
commit
83d44b8991
@ -11,7 +11,7 @@ set GLM=..\extern\glm-0.9.7.5
|
|||||||
REM EHsc enables exception handling
|
REM EHsc enables exception handling
|
||||||
REM MD uses dynamic runtime library
|
REM MD uses dynamic runtime library
|
||||||
REM Zi enables debug data
|
REM Zi enables debug data
|
||||||
set compileFlags=/EHsc /MD /Zi
|
set compileFlags=/EHsc /MD /Zi /W3
|
||||||
|
|
||||||
REM Include directories
|
REM Include directories
|
||||||
set includeFlags=/I ..\src\include /I %GLEW%\include /I %GLFW%\include /I %STB%\include /I %GLM%\include
|
set includeFlags=/I ..\src\include /I %GLEW%\include /I %GLFW%\include /I %STB%\include /I %GLM%\include
|
||||||
|
142
src/dengine.cpp
142
src/dengine.cpp
@ -14,6 +14,18 @@
|
|||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
glm::vec3 cameraPos = glm::vec3(0.0f, 0.0f, 3.0f);
|
||||||
|
glm::vec3 cameraFront = glm::vec3(0.0f, 0.0f, -1.0f);
|
||||||
|
glm::vec3 cameraUp = glm::vec3(0.0f, 1.0f, 0.0f);
|
||||||
|
|
||||||
|
f32 lastX = 400;
|
||||||
|
f32 lastY = 300;
|
||||||
|
f32 yaw = -90.0f;
|
||||||
|
f32 pitch = 0.0f;
|
||||||
|
b32 firstMouse;
|
||||||
|
|
||||||
|
b32 keys[1024];
|
||||||
|
|
||||||
enum BytesPerPixel
|
enum BytesPerPixel
|
||||||
{
|
{
|
||||||
Greyscale = 1,
|
Greyscale = 1,
|
||||||
@ -42,12 +54,69 @@ INTERNAL GLint getGLFormat(BytesPerPixel bytesPerPixel, b32 srgb)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void key_callback(GLFWwindow *window, int key, int scancode, int action, int mode)
|
void doMovement(f32 deltaTime)
|
||||||
|
{
|
||||||
|
f32 cameraSpeed = 5.00f * deltaTime;
|
||||||
|
if (keys[GLFW_KEY_W])
|
||||||
|
cameraPos += (cameraSpeed * cameraFront);
|
||||||
|
if (keys[GLFW_KEY_S])
|
||||||
|
cameraPos -= (cameraSpeed * cameraFront);
|
||||||
|
if (keys[GLFW_KEY_A])
|
||||||
|
cameraPos -=
|
||||||
|
glm::normalize(glm::cross(cameraFront, cameraUp)) * cameraSpeed;
|
||||||
|
if (keys[GLFW_KEY_D])
|
||||||
|
cameraPos +=
|
||||||
|
glm::normalize(glm::cross(cameraFront, cameraUp)) * cameraSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
void key_callback(GLFWwindow *window, int key, int scancode, int action,
|
||||||
|
int mode)
|
||||||
{
|
{
|
||||||
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
|
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
|
||||||
{
|
{
|
||||||
glfwSetWindowShouldClose(window, GL_TRUE);
|
glfwSetWindowShouldClose(window, GL_TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (key >= 0 && key < 1024)
|
||||||
|
{
|
||||||
|
if (action == GLFW_PRESS)
|
||||||
|
keys[key] = TRUE;
|
||||||
|
else if (action == GLFW_RELEASE)
|
||||||
|
keys[key] = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void mouse_callback(GLFWwindow *window, double xPos, double yPos)
|
||||||
|
{
|
||||||
|
if (firstMouse)
|
||||||
|
{
|
||||||
|
lastX = (f32)xPos;
|
||||||
|
lastY = (f32)yPos;
|
||||||
|
firstMouse = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
f32 xOffset = (f32)xPos - lastX;
|
||||||
|
f32 yOffset = lastY - (f32)yPos;
|
||||||
|
lastX = (f32)xPos;
|
||||||
|
lastY = (f32)yPos;
|
||||||
|
|
||||||
|
f32 sensitivity = 0.05f;
|
||||||
|
xOffset *= sensitivity;
|
||||||
|
yOffset *= sensitivity;
|
||||||
|
|
||||||
|
yaw += xOffset;
|
||||||
|
pitch += yOffset;
|
||||||
|
|
||||||
|
if (pitch > 89.0f)
|
||||||
|
pitch = 89.0f;
|
||||||
|
else if (pitch < -89.0f)
|
||||||
|
pitch = -89.0f;
|
||||||
|
|
||||||
|
glm::vec3 front;
|
||||||
|
front.x = cos(glm::radians(pitch)) * cos(glm::radians(yaw));
|
||||||
|
front.y = sin(glm::radians(pitch));
|
||||||
|
front.z = cos(glm::radians(pitch)) * sin(glm::radians(yaw));
|
||||||
|
cameraFront = glm::normalize(front);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
@ -84,6 +153,9 @@ int main()
|
|||||||
glViewport(0, 0, screenWidth, screenHeight);
|
glViewport(0, 0, screenWidth, screenHeight);
|
||||||
|
|
||||||
glfwSetKeyCallback(window, key_callback);
|
glfwSetKeyCallback(window, key_callback);
|
||||||
|
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
|
||||||
|
glfwSetCursorPosCallback(window, mouse_callback);
|
||||||
|
firstMouse = TRUE;
|
||||||
|
|
||||||
glEnable(GL_DEPTH_TEST);
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
@ -105,7 +177,8 @@ int main()
|
|||||||
/* Load a texture */
|
/* Load a texture */
|
||||||
i32 imgWidth, imgHeight, bytesPerPixel;
|
i32 imgWidth, imgHeight, bytesPerPixel;
|
||||||
stbi_set_flip_vertically_on_load(TRUE);
|
stbi_set_flip_vertically_on_load(TRUE);
|
||||||
u8 *image = stbi_load("data/textures/container.jpg", &imgWidth, &imgHeight, &bytesPerPixel, 0);
|
u8 *image = stbi_load("data/textures/container.jpg", &imgWidth, &imgHeight,
|
||||||
|
&bytesPerPixel, 0);
|
||||||
|
|
||||||
if (!image)
|
if (!image)
|
||||||
{
|
{
|
||||||
@ -249,59 +322,56 @@ int main()
|
|||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
glBindVertexArray(0);
|
glBindVertexArray(0);
|
||||||
|
|
||||||
glm::vec3 cameraPos = glm::vec3(0.0f, 0.0f, 3.0f);
|
f32 deltaTime = 0.0f; // Time between current frame and last frame
|
||||||
glm::vec3 cameraTarget = glm::vec3(0.0f, 0.0f, 0.0f);
|
f32 lastFrame = 0.0f; // Time of last frame
|
||||||
glm::vec3 cameraDirection = glm::normalize(cameraPos - cameraTarget);
|
|
||||||
|
|
||||||
glm::vec3 upVec = glm::vec3(0.0f, 1.0f, 0.0f);
|
|
||||||
glm::vec3 cameraRight = glm::normalize(glm::cross(upVec, cameraPos));
|
|
||||||
glm::vec3 cameraUp = glm::cross(cameraDirection, cameraRight);
|
|
||||||
|
|
||||||
glm::mat4 view;
|
|
||||||
// NOTE(doyle): Lookat generates the matrix for camera coordinate axis
|
|
||||||
view = glm::lookAt(cameraPos, cameraTarget, upVec);
|
|
||||||
|
|
||||||
/* Main game loop */
|
/* Main game loop */
|
||||||
while (!glfwWindowShouldClose(window))
|
while (!glfwWindowShouldClose(window))
|
||||||
{
|
{
|
||||||
|
f32 currentFrame = (f32)glfwGetTime();
|
||||||
|
deltaTime = currentFrame - lastFrame;
|
||||||
|
lastFrame = currentFrame;
|
||||||
|
|
||||||
/* Check and call events */
|
/* Check and call events */
|
||||||
glfwPollEvents();
|
glfwPollEvents();
|
||||||
|
doMovement(deltaTime);
|
||||||
|
|
||||||
/* Rendering commands here*/
|
/* Rendering commands here*/
|
||||||
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
|
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
shader.use();
|
/* Bind textures */
|
||||||
|
|
||||||
/* Camera */
|
|
||||||
GLfloat radius = 10.0f;
|
|
||||||
GLfloat camX = sin(glfwGetTime()) * radius;
|
|
||||||
GLfloat camZ = cos(glfwGetTime()) * radius;
|
|
||||||
view = glm::lookAt(glm::vec3(camX, 0.0, camZ), cameraTarget, upVec);
|
|
||||||
|
|
||||||
/* Math */
|
|
||||||
view = glm::translate(view, glm::vec3(0.0f, 0.0f, -3.0f));
|
|
||||||
|
|
||||||
glm::mat4 projection;
|
|
||||||
projection =
|
|
||||||
glm::perspective(glm::radians(45.0f), ((f32)screenWidth / (f32)screenHeight), 0.1f, 100.0f);
|
|
||||||
|
|
||||||
|
|
||||||
GLuint modelLoc = glGetUniformLocation(shader.mProgram, "model");
|
|
||||||
GLuint viewLoc = glGetUniformLocation(shader.mProgram, "view");
|
|
||||||
glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));
|
|
||||||
|
|
||||||
GLuint projectionLoc = glGetUniformLocation(shader.mProgram, "projection");
|
|
||||||
glUniformMatrix4fv(projectionLoc, 1, GL_FALSE, glm::value_ptr(projection));
|
|
||||||
|
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
glBindTexture(GL_TEXTURE_2D, texture);
|
glBindTexture(GL_TEXTURE_2D, texture);
|
||||||
glUniform1i(glGetUniformLocation(shader.mProgram, "ourTexture"), 0);
|
glUniform1i(glGetUniformLocation(shader.mProgram, "ourTexture"), 0);
|
||||||
|
|
||||||
|
shader.use();
|
||||||
|
|
||||||
|
/* Camera/View transformation */
|
||||||
|
glm::mat4 view;
|
||||||
|
// NOTE(doyle): Lookat generates the matrix for camera coordinate axis
|
||||||
|
view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp);
|
||||||
|
|
||||||
|
/* Projection */
|
||||||
|
glm::mat4 projection;
|
||||||
|
projection = glm::perspective(glm::radians(45.0f),
|
||||||
|
((f32)screenWidth / (f32)screenHeight),
|
||||||
|
0.1f, 100.0f);
|
||||||
|
|
||||||
|
/* Get shader uniform locations */
|
||||||
|
GLuint modelLoc = glGetUniformLocation(shader.mProgram, "model");
|
||||||
|
GLuint viewLoc = glGetUniformLocation(shader.mProgram, "view");
|
||||||
|
GLuint projectionLoc = glGetUniformLocation(shader.mProgram, "projection");
|
||||||
|
|
||||||
|
/* Pass matrices to the shader */
|
||||||
|
glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));
|
||||||
|
glUniformMatrix4fv(projectionLoc, 1, GL_FALSE, glm::value_ptr(projection));
|
||||||
|
|
||||||
glBindVertexArray(vao);
|
glBindVertexArray(vao);
|
||||||
// glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
|
// glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
|
||||||
for (GLuint i = 0; i < 10; i++)
|
for (GLuint i = 0; i < 10; i++)
|
||||||
{
|
{
|
||||||
|
/* Calculate model matrix for each object and pass it to shader */
|
||||||
glm::mat4 model;
|
glm::mat4 model;
|
||||||
model = glm::translate(model, cubePositions[i]);
|
model = glm::translate(model, cubePositions[i]);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user