vectozavr-shooter/engine/Engine.cpp

127 lines
4.0 KiB
C++
Raw Normal View History

2021-09-13 15:53:43 +03:00
//
// Created by Иван Ильин on 14.01.2021.
//
2021-10-31 11:39:08 +03:00
#include <iostream>
2021-09-13 15:53:43 +03:00
#include "Engine.h"
#include "utils/Time.h"
#include "ResourceManager.h"
#include "animation/Timeline.h"
2021-10-17 19:38:16 +03:00
#include "SoundController.h"
2021-09-13 15:53:43 +03:00
Engine::Engine() {
2021-10-17 19:38:16 +03:00
Time::init();
Timeline::init();
ResourceManager::init();
SoundController::init();
2021-09-13 15:53:43 +03:00
}
2021-10-31 11:39:08 +03:00
void Engine::create(int screenWidth, int screenHeight, const std::string &name, bool verticalSync, sf::Color background,
sf::Uint32 style) {
_name = name;
2021-09-13 15:53:43 +03:00
screen->open(screenWidth, screenHeight, name, verticalSync, background, style);
2021-10-31 11:39:08 +03:00
Log::log("Engine::create(): started engine (" + std::to_string(screenWidth) + "x" + std::to_string(screenHeight) +
") with title '" + name + "'.");
2021-09-13 15:53:43 +03:00
Time::update();
start();
camera->init(screenWidth, screenHeight);
while (screen->isOpen()) {
screen->clear();
Time::update();
update();
2021-09-13 15:53:43 +03:00
// sometimes we dont need to update physics world
// (for example in menu or while pause)
// hence we can set '_updateWorld' equal to false in setUpdateWorld(bool):
2021-10-31 11:39:08 +03:00
if (_updateWorld) {
2021-09-13 15:53:43 +03:00
Timeline::update();
world->update();
2021-09-13 15:53:43 +03:00
2021-10-31 11:39:08 +03:00
if (_useOpenGL) {
GLfloat *view = camera->glView();
for (auto &it : *world) {
2021-10-22 19:42:32 +03:00
if (it.second->isVisible()) {
2021-10-31 11:39:08 +03:00
GLfloat *model = it.second->glModel();
GLfloat *geometry = Screen::glMeshToGLfloatArray(it.second, camera->position());
2021-10-29 23:44:37 +03:00
screen->glDrawMesh(geometry, view, model, 3 * it.second->triangles().size());
2021-10-22 19:42:32 +03:00
free(geometry);
2021-10-29 23:44:37 +03:00
free(model);
2021-10-22 19:42:32 +03:00
}
}
free(view);
} else {
// clear triangles from previous frame
camera->clear();
// project triangles to the camera plane
2021-10-31 11:39:08 +03:00
for (auto &it : *world) {
2021-10-22 19:42:32 +03:00
camera->project(it.second);
2021-10-28 16:58:02 +03:00
}
2021-10-22 19:42:32 +03:00
// draw triangles on the screen
2021-10-28 16:58:02 +03:00
for (auto &t : camera->sorted()) {
2021-10-22 19:42:32 +03:00
screen->drawTriangle(*t);
2021-10-28 16:58:02 +03:00
}
2021-10-22 19:42:32 +03:00
_triPerSec = camera->buffSize() * Time::fps();
}
2021-10-30 12:39:44 +03:00
if (Consts::SHOW_FPS_COUNTER) {
2021-10-31 13:00:38 +03:00
screen->drawText(std::to_string(Time::fps()) + " fps", Vec2D(static_cast<double>(screen->width()) - 100.0, 10.0), 25,
2021-10-31 11:39:08 +03:00
sf::Color(100, 100, 100));
2021-10-30 12:39:44 +03:00
}
printDebugText();
gui();
2021-09-13 15:53:43 +03:00
}
screen->display();
}
}
void Engine::exit() {
2021-10-31 11:39:08 +03:00
if (screen->isOpen()) {
2021-09-13 15:53:43 +03:00
screen->close();
}
2021-10-17 19:38:16 +03:00
SoundController::free();
ResourceManager::free();
Timeline::free();
Time::free();
2021-10-31 11:39:08 +03:00
Log::log("Engine::exit(): exit engine (" + std::to_string(screen->width()) + "x" +
2021-10-31 13:00:38 +03:00
std::to_string(screen->height()) + ") with title '" + screen->title() + "'.");
}
void Engine::printDebugText() const {
2021-10-30 12:39:44 +03:00
if (_debugText) {
2021-10-30 12:39:44 +03:00
std::string text = _name + "\n\n X: " +
2021-10-31 11:39:08 +03:00
std::to_string((camera->position().x())) + "\n Y: " +
std::to_string((camera->position().y())) + "\n Z: " +
std::to_string((camera->position().z())) + "\n\n" +
std::to_string(screen->width()) + "x" +
std::to_string(screen->height()) + "\t" +
std::to_string(Time::fps()) + " fps";
if (_useOpenGL) {
2021-10-30 12:39:44 +03:00
text += "\n Using OpenGL acceleration";
2021-10-22 19:42:32 +03:00
} else {
2021-10-31 13:00:38 +03:00
text += "\n" + std::to_string( _triPerSec) + " tris/s";
2021-10-22 19:42:32 +03:00
}
2021-10-30 12:39:44 +03:00
sf::Text t;
t.setFont(*ResourceManager::loadFont(Consts::THIN_FONT));
t.setString(text);
t.setCharacterSize(30);
t.setFillColor(sf::Color::Black);
2021-10-31 13:00:38 +03:00
t.setPosition(static_cast<float>(screen->width()) - 400.0f, 10.0f);
2021-10-30 12:39:44 +03:00
screen->drawText(t);
}
2021-09-13 15:53:43 +03:00
}