2018-06-02 16:45:16 +00:00
|
|
|
// Voxspatium Engine - Voxel Planets Engine
|
2018-04-14 14:42:32 +00:00
|
|
|
// Copyright (C) 2018 Evert "Diamond" Prants <evert@lunasqu.ee>
|
|
|
|
//
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
//
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
|
2018-04-13 19:53:56 +00:00
|
|
|
#include "Application.h"
|
2018-04-14 06:53:15 +00:00
|
|
|
#include "util/Log.h"
|
2018-04-14 19:56:06 +00:00
|
|
|
#include "Shader.h"
|
2018-04-13 19:53:56 +00:00
|
|
|
|
2018-06-05 11:40:39 +00:00
|
|
|
#include "planet/Planet.h"
|
|
|
|
|
2022-09-28 19:20:47 +00:00
|
|
|
Application::Application() : m_width(1920), m_height(1080), m_lock(true), m_pauseLod(false)
|
2018-04-13 19:53:56 +00:00
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
Application::~Application()
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2018-04-14 14:42:32 +00:00
|
|
|
void Application::initialize()
|
2018-04-13 19:53:56 +00:00
|
|
|
{
|
|
|
|
if (SDL_Init(SDL_INIT_VIDEO) < 0)
|
|
|
|
{
|
|
|
|
printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError());
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Create our window centered at 1080x720 resolution
|
|
|
|
m_window = SDL_CreateWindow(
|
2018-06-02 16:45:16 +00:00
|
|
|
"Voxspatium Engine",
|
2018-04-13 19:53:56 +00:00
|
|
|
SDL_WINDOWPOS_CENTERED,
|
|
|
|
SDL_WINDOWPOS_CENTERED,
|
2018-04-14 19:56:06 +00:00
|
|
|
m_width,
|
|
|
|
m_height,
|
2018-04-13 19:53:56 +00:00
|
|
|
SDL_WINDOW_OPENGL
|
|
|
|
);
|
|
|
|
|
|
|
|
if (!m_window)
|
|
|
|
{
|
|
|
|
printf("Window could not be created! SDL_Error: %s\n", SDL_GetError());
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Set GL Attributes
|
2018-06-06 09:34:59 +00:00
|
|
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
|
2018-04-13 19:53:56 +00:00
|
|
|
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
|
|
|
|
|
2018-04-14 06:53:15 +00:00
|
|
|
m_glContext = SDL_GL_CreateContext(m_window);
|
2018-04-13 19:53:56 +00:00
|
|
|
|
2018-04-14 06:53:15 +00:00
|
|
|
if(m_glContext == NULL)
|
2018-04-13 19:53:56 +00:00
|
|
|
{
|
|
|
|
printf("OpenGL context could not be created! SDL Error: %s\n", SDL_GetError());
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2018-04-14 19:56:06 +00:00
|
|
|
SDL_GL_MakeCurrent(m_window, m_glContext);
|
|
|
|
|
2018-04-13 19:53:56 +00:00
|
|
|
// Initialize GLEW
|
|
|
|
glewInit();
|
|
|
|
|
2018-04-14 12:31:42 +00:00
|
|
|
// Create camera
|
2020-03-26 17:42:05 +00:00
|
|
|
m_camera = new Camera(glm::vec3(0.0f, 0.0f, -800.0f), glm::vec3(0.0f, 1.0f, 0.0f), 90.0f, 0.0f);
|
2018-04-14 12:31:42 +00:00
|
|
|
|
2018-04-13 19:53:56 +00:00
|
|
|
// Run the engine
|
2018-04-14 14:42:32 +00:00
|
|
|
run();
|
2018-04-13 19:53:56 +00:00
|
|
|
}
|
|
|
|
|
2018-04-14 14:42:32 +00:00
|
|
|
void Application::handleEvents()
|
2018-04-14 12:31:42 +00:00
|
|
|
{
|
|
|
|
/* Update the input manager */
|
2018-04-14 14:42:32 +00:00
|
|
|
Input::getInstance().flush();
|
2018-04-14 12:31:42 +00:00
|
|
|
|
|
|
|
/* Check for events */
|
|
|
|
SDL_Event e;
|
|
|
|
while ( SDL_PollEvent(&e) )
|
|
|
|
{
|
|
|
|
switch(e.type)
|
|
|
|
{
|
|
|
|
case SDL_QUIT:
|
2018-04-14 14:42:32 +00:00
|
|
|
exit();
|
2018-04-14 12:31:42 +00:00
|
|
|
break;
|
|
|
|
case SDL_KEYDOWN:
|
|
|
|
Input::getInstance().pressKey(e.key.keysym.sym);
|
|
|
|
break;
|
|
|
|
case SDL_KEYUP:
|
|
|
|
Input::getInstance().releaseKey(e.key.keysym.sym);
|
|
|
|
break;
|
|
|
|
case SDL_MOUSEMOTION:
|
|
|
|
Input::getInstance().setMouseCoords(e.motion.x, e.motion.y);
|
|
|
|
break;
|
|
|
|
case SDL_MOUSEBUTTONDOWN:
|
|
|
|
Input::getInstance().pressKey(e.button.button);
|
|
|
|
break;
|
|
|
|
case SDL_MOUSEBUTTONUP:
|
|
|
|
Input::getInstance().releaseKey(e.button.button);
|
|
|
|
break;
|
|
|
|
case SDL_MOUSEWHEEL:
|
|
|
|
Input::getInstance().setMouseWheel(e.wheel.y, e.wheel.x);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
glm::vec2 mousepos = Input::getInstance().getMouseCoords();
|
2021-11-06 13:11:55 +00:00
|
|
|
if (m_lock || Input::getInstance().isKeyDown(SDL_BUTTON_RIGHT)) {
|
|
|
|
// Force mouse to the center of the screen
|
|
|
|
SDL_WarpMouseInWindow(m_window, m_width/2, m_height/2);
|
2018-04-14 20:37:47 +00:00
|
|
|
|
2021-11-06 13:11:55 +00:00
|
|
|
// Handle Camera Movement
|
|
|
|
m_camera->processMouseMovement(-(m_width/2 - mousepos.x), m_height/2 - mousepos.y, GL_TRUE);
|
|
|
|
}
|
2018-04-14 12:31:42 +00:00
|
|
|
|
2018-04-14 19:56:06 +00:00
|
|
|
// Handle Camera Movement Keys
|
2018-04-14 12:31:42 +00:00
|
|
|
if(Input::getInstance().isKeyDown(SDLK_w))
|
2022-02-25 16:39:45 +00:00
|
|
|
m_camera->processKeyboard(Camera_Movement::CAM_FORWARD, 0.01f);
|
2018-04-14 12:31:42 +00:00
|
|
|
|
|
|
|
if(Input::getInstance().isKeyDown(SDLK_s))
|
2022-02-25 16:39:45 +00:00
|
|
|
m_camera->processKeyboard(Camera_Movement::CAM_BACKWARD, 0.01f);
|
2018-04-14 12:31:42 +00:00
|
|
|
|
|
|
|
if(Input::getInstance().isKeyDown(SDLK_d))
|
2022-02-25 16:39:45 +00:00
|
|
|
m_camera->processKeyboard(Camera_Movement::CAM_RIGHT, 0.01f);
|
2018-04-14 12:31:42 +00:00
|
|
|
|
|
|
|
if(Input::getInstance().isKeyDown(SDLK_a))
|
2022-02-25 16:39:45 +00:00
|
|
|
m_camera->processKeyboard(Camera_Movement::CAM_LEFT, 0.01f);
|
2018-04-14 12:31:42 +00:00
|
|
|
|
2018-04-14 19:56:06 +00:00
|
|
|
// Handle Camera Zoom
|
2018-04-14 14:42:32 +00:00
|
|
|
m_camera->processMouseScroll((float) Input::getInstance().getMouseWheelVertical() / 10.0f);
|
2018-04-14 12:31:42 +00:00
|
|
|
|
2018-04-14 19:56:06 +00:00
|
|
|
// Print mouse position on click
|
2018-04-14 12:31:42 +00:00
|
|
|
if(Input::getInstance().isKeyPressed(SDL_BUTTON_LEFT))
|
|
|
|
std::cout << "mX: " << mousepos.x << " mY: " << mousepos.y << std::endl;
|
2018-04-14 19:56:06 +00:00
|
|
|
|
2020-03-26 17:42:05 +00:00
|
|
|
// Toggle wireframe
|
|
|
|
if(Input::getInstance().isKeyPressed(SDLK_x))
|
|
|
|
m_wireframe = !m_wireframe;
|
|
|
|
|
2018-04-14 19:56:06 +00:00
|
|
|
// Exit game on Esc
|
2021-11-06 13:11:55 +00:00
|
|
|
if(Input::getInstance().isKeyPressed(SDLK_ESCAPE)) {
|
|
|
|
m_lock = !m_lock;
|
|
|
|
if (m_lock) {
|
|
|
|
SDL_SetWindowGrab(m_window, SDL_TRUE);
|
|
|
|
SDL_ShowCursor(SDL_DISABLE);
|
|
|
|
} else {
|
|
|
|
SDL_SetWindowGrab(m_window, SDL_FALSE);
|
|
|
|
SDL_ShowCursor(SDL_ENABLE);
|
|
|
|
}
|
|
|
|
}
|
2022-09-28 19:20:47 +00:00
|
|
|
|
|
|
|
if (Input::getInstance().isKeyPressed(SDLK_p))
|
|
|
|
m_pauseLod = !m_pauseLod;
|
2018-04-14 12:31:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-04-14 14:42:32 +00:00
|
|
|
void Application::run()
|
2018-04-13 19:53:56 +00:00
|
|
|
{
|
|
|
|
m_run = true;
|
2020-03-26 17:42:05 +00:00
|
|
|
m_wireframe = false;
|
2018-04-14 14:42:32 +00:00
|
|
|
m_now = SDL_GetPerformanceCounter();
|
|
|
|
m_last = 0;
|
2018-04-13 19:53:56 +00:00
|
|
|
|
2018-04-14 19:56:06 +00:00
|
|
|
// TEST CODE
|
2018-04-14 20:37:47 +00:00
|
|
|
SDL_ShowCursor(SDL_DISABLE);
|
|
|
|
Input::getInstance().setMouseCoords(m_width/2, m_height/2);
|
2018-04-14 19:56:06 +00:00
|
|
|
|
2021-11-06 12:25:13 +00:00
|
|
|
PlanetNoiseParams noise{15.f, 15.f, .8f, 1.f/.8f};
|
2020-03-27 10:44:33 +00:00
|
|
|
Planet* pl = new Planet(glm::vec3(0.0f,0.0f,0.0f), 500.0f, noise);
|
2018-06-06 18:11:17 +00:00
|
|
|
// Create the shader and link them together
|
2022-02-25 16:39:45 +00:00
|
|
|
Shader& chunkShader = Shader::createShader("../data/shaders/chunk.vert", "../data/shaders/chunk.frag");
|
2018-06-06 18:11:17 +00:00
|
|
|
chunkShader.linkShaders();
|
|
|
|
|
|
|
|
// Set attribute arrays
|
|
|
|
chunkShader.setAttribute("position", 3, GL_FALSE, 8, 0, GL_FLOAT);
|
|
|
|
chunkShader.setAttribute("normal", 3, GL_TRUE, 8, 3, GL_FLOAT);
|
|
|
|
chunkShader.setAttribute("uv", 2, GL_FALSE, 8, 6, GL_FLOAT);
|
2018-06-05 11:40:39 +00:00
|
|
|
|
2018-04-14 19:56:06 +00:00
|
|
|
// END TEST CODE
|
|
|
|
|
2018-04-14 06:53:15 +00:00
|
|
|
while(m_run)
|
2018-04-13 19:53:56 +00:00
|
|
|
{
|
2018-04-14 14:42:32 +00:00
|
|
|
m_last = m_now;
|
|
|
|
m_now = SDL_GetPerformanceCounter();
|
2018-04-14 12:31:42 +00:00
|
|
|
|
2018-04-14 14:42:32 +00:00
|
|
|
handleEvents();
|
2018-04-13 19:53:56 +00:00
|
|
|
|
2018-04-14 19:56:06 +00:00
|
|
|
// Clear color buffer
|
2022-10-01 09:00:55 +00:00
|
|
|
glClearColor(0.0f, 0.0f, 0.0f, 1.f);
|
2018-04-14 20:37:47 +00:00
|
|
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
2018-04-14 19:56:06 +00:00
|
|
|
|
2018-04-14 14:42:32 +00:00
|
|
|
deltaTime = ((m_now - m_last) / (double)SDL_GetPerformanceFrequency());
|
2018-04-13 19:53:56 +00:00
|
|
|
|
2018-04-14 19:56:06 +00:00
|
|
|
// TEST CODE
|
2020-03-26 17:42:05 +00:00
|
|
|
glEnable(GL_DEPTH_TEST);
|
2020-03-27 10:44:33 +00:00
|
|
|
glEnable(GL_CULL_FACE);
|
2023-02-24 13:34:40 +00:00
|
|
|
glCullFace(GL_BACK);
|
2018-04-14 20:37:47 +00:00
|
|
|
|
2022-09-28 19:20:47 +00:00
|
|
|
if (!m_pauseLod)
|
|
|
|
pl->tick(m_camera, deltaTime);
|
2018-06-06 18:11:17 +00:00
|
|
|
|
2020-03-26 17:42:05 +00:00
|
|
|
if (m_wireframe)
|
|
|
|
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
|
2018-06-06 18:11:17 +00:00
|
|
|
|
|
|
|
pl->draw(m_camera, &chunkShader);
|
|
|
|
|
2020-03-26 17:42:05 +00:00
|
|
|
if (m_wireframe)
|
|
|
|
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
|
2018-06-06 18:11:17 +00:00
|
|
|
|
2018-04-14 19:56:06 +00:00
|
|
|
// END TEST CODE
|
|
|
|
|
|
|
|
update(deltaTime);
|
|
|
|
render();
|
2018-04-13 19:53:56 +00:00
|
|
|
|
|
|
|
// Update window with OpenGL rendering
|
|
|
|
SDL_GL_SwapWindow(m_window);
|
|
|
|
}
|
|
|
|
|
2018-04-14 06:53:15 +00:00
|
|
|
// After loop exits
|
|
|
|
|
|
|
|
// Destroy window
|
2018-04-13 19:53:56 +00:00
|
|
|
SDL_DestroyWindow(m_window);
|
|
|
|
m_window = NULL;
|
|
|
|
|
2018-04-14 06:53:15 +00:00
|
|
|
// Destroy context
|
|
|
|
SDL_GL_DeleteContext(m_glContext);
|
|
|
|
|
|
|
|
// Quit SDL subsystems
|
2018-04-13 19:53:56 +00:00
|
|
|
SDL_Quit();
|
|
|
|
}
|
|
|
|
|
2018-04-14 14:42:32 +00:00
|
|
|
void Application::update(GLfloat dtime)
|
2018-04-13 19:53:56 +00:00
|
|
|
{
|
2018-04-16 10:51:02 +00:00
|
|
|
|
2018-04-13 19:53:56 +00:00
|
|
|
}
|
|
|
|
|
2018-04-14 14:42:32 +00:00
|
|
|
void Application::render()
|
2018-04-13 19:53:56 +00:00
|
|
|
{
|
|
|
|
|
|
|
|
}
|