From 7e5c96c123cdbfe2c1a1df238fe3c2a5e873888d Mon Sep 17 00:00:00 2001 From: Vectozavr <60608292+vectozavr@users.noreply.github.com> Date: Mon, 13 Sep 2021 19:53:43 +0700 Subject: [PATCH] Initial commit --- .gitignore | 3 + Ak47.cpp | 17 + Ak47.h | 16 + Bonus.cpp | 13 + Bonus.h | 21 + CMakeLists.txt | 105 + Client.cpp | 217 ++ Client.h | 45 + Gold_Ak47.h | 27 + Gun.cpp | 22 + Gun.h | 16 + Player.cpp | 343 +++ Player.h | 165 ++ README.md | 71 + Rifle.cpp | 20 + Rifle.h | 16 + Server.cpp | 166 ++ Server.h | 43 + Shotgun.cpp | 56 + Shotgun.h | 17 + Weapon.cpp | 127 + Weapon.h | 80 + engine/Camera.cpp | 256 ++ engine/Camera.h | 98 + engine/CameraController.cpp | 38 + engine/CameraController.h | 21 + engine/Engine.cpp | 105 + engine/Engine.h | 41 + engine/Mesh.cpp | 308 +++ engine/Mesh.h | 84 + engine/Object.h | 36 + engine/Plane.cpp | 111 + engine/Plane.h | 35 + engine/ResourceManager.cpp | 123 + engine/ResourceManager.h | 32 + engine/Screen.cpp | 205 ++ engine/Screen.h | 92 + engine/Triangle.cpp | 80 + engine/Triangle.h | 45 + engine/World.cpp | 81 + engine/World.h | 38 + engine/animation/AColor.h | 40 + engine/animation/AFunction.h | 36 + engine/animation/ARotate.h | 29 + engine/animation/AScale.h | 39 + engine/animation/ATranslate.h | 33 + engine/animation/ATranslateToPoint.h | 34 + engine/animation/AWait.h | 30 + engine/animation/Animatable.cpp | 91 + engine/animation/Animatable.h | 92 + engine/animation/Animation.cpp | 49 + engine/animation/Animation.h | 62 + engine/animation/Interpolation.h | 86 + engine/fonts/Roboto-Light.ttf | Bin 0 -> 170012 bytes engine/fonts/Roboto-Medium.ttf | Bin 0 -> 171656 bytes engine/fonts/Roboto-Thin.ttf | Bin 0 -> 171500 bytes engine/fonts/fontRU.ttf | Bin 0 -> 70612 bytes engine/gui/Button.cpp | 58 + engine/gui/Button.h | 58 + engine/gui/Window.cpp | 53 + engine/gui/Window.h | 41 + engine/network/ClientUDP.cpp | 126 + engine/network/ClientUDP.h | 47 + engine/network/MsgType.cpp | 18 + engine/network/MsgType.h | 38 + engine/network/ReliableMsg.cpp | 23 + engine/network/ReliableMsg.h | 27 + engine/network/ServerUDP.cpp | 129 + engine/network/ServerUDP.h | 50 + engine/network/UDPConnection.cpp | 44 + engine/network/UDPConnection.h | 30 + engine/network/UDPSocket.cpp | 195 ++ engine/network/UDPSocket.h | 53 + engine/network/config.h | 13 + engine/network/connect.txt | 2 + engine/network/server.txt | 1 + engine/physics/RigidBody.cpp | 330 +++ engine/physics/RigidBody.h | 88 + engine/physics/Simplex.h | 38 + engine/physics/Solver.cpp | 38 + engine/physics/Solver.h | 16 + engine/utils/Log.cpp | 22 + engine/utils/Log.h | 16 + engine/utils/Matrix4x4.cpp | 430 ++++ engine/utils/Matrix4x4.h | 88 + engine/utils/Point4D.cpp | 175 ++ engine/utils/Point4D.h | 72 + engine/utils/Time.cpp | 78 + engine/utils/Time.h | 18 + img/gamePlay2.png | Bin 0 -> 477558 bytes img/gamePlay3.png | Bin 0 -> 556093 bytes img/gamePlay4.png | Bin 0 -> 440617 bytes img/gamePlay5.png | Bin 0 -> 476365 bytes img/gamePlay6.png | Bin 0 -> 142510 bytes img/gamePlay7.png | Bin 0 -> 429327 bytes main.cpp | 200 ++ maps/map1.obj | 3393 ++++++++++++++++++++++++++ maps/materials.txt | 38 + obj/ability.obj | 51 + obj/ability_mat.txt | 1 + obj/ak47.obj | 327 +++ obj/ak47_mat.txt | 3 + obj/cube.obj | 23 + obj/gold_ak47.obj | 327 +++ obj/gold_ak47_mat.txt | 3 + obj/gun.obj | 561 +++++ obj/gun_mat.txt | 3 + obj/hill.obj | 219 ++ obj/hill_mat.txt | 3 + obj/rifle.obj | 591 +++++ obj/rifle_mat.txt | 2 + obj/shotgun.obj | 291 +++ obj/shotgun_mat.txt | 4 + sound/backNoise.ogg | Bin 0 -> 7900747 bytes sound/classic_hurt.ogg | Bin 0 -> 36510 bytes sound/click.ogg | Bin 0 -> 14167 bytes sound/fallbig.ogg | Bin 0 -> 17140 bytes sound/fullAbility.ogg | Bin 0 -> 15264 bytes sound/fullHealth.ogg | Bin 0 -> 46048 bytes sound/kill.ogg | Bin 0 -> 11875 bytes sound/slow_mo.ogg | Bin 0 -> 65762 bytes sound/stonestep1.ogg | Bin 0 -> 17805 bytes sound/stonestep2.ogg | Bin 0 -> 15681 bytes sound/stonestep3.ogg | Bin 0 -> 14610 bytes sound/stonestep4.ogg | Bin 0 -> 17230 bytes sound/stonestep5.ogg | Bin 0 -> 17488 bytes sound/stonestep6.ogg | Bin 0 -> 18187 bytes sound/unslow_mo.ogg | Bin 0 -> 24085 bytes sound/weapons/ak47.ogg | Bin 0 -> 7123 bytes sound/weapons/change_weapon.ogg | Bin 0 -> 32334 bytes sound/weapons/gun.ogg | Bin 0 -> 25609 bytes sound/weapons/no_ammo.ogg | Bin 0 -> 9384 bytes sound/weapons/reload_ak47.ogg | Bin 0 -> 39491 bytes sound/weapons/reload_gun.ogg | Bin 0 -> 19514 bytes sound/weapons/reload_shotgun.ogg | Bin 0 -> 23920 bytes sound/weapons/shotgun.ogg | Bin 0 -> 7157 bytes textures/back.png | Bin 0 -> 839817 bytes textures/gui.png | Bin 0 -> 21053 bytes 138 files changed, 12511 insertions(+) create mode 100644 .gitignore create mode 100755 Ak47.cpp create mode 100755 Ak47.h create mode 100755 Bonus.cpp create mode 100755 Bonus.h create mode 100755 CMakeLists.txt create mode 100755 Client.cpp create mode 100755 Client.h create mode 100755 Gold_Ak47.h create mode 100755 Gun.cpp create mode 100755 Gun.h create mode 100755 Player.cpp create mode 100755 Player.h create mode 100755 README.md create mode 100755 Rifle.cpp create mode 100755 Rifle.h create mode 100755 Server.cpp create mode 100755 Server.h create mode 100755 Shotgun.cpp create mode 100755 Shotgun.h create mode 100755 Weapon.cpp create mode 100755 Weapon.h create mode 100755 engine/Camera.cpp create mode 100755 engine/Camera.h create mode 100755 engine/CameraController.cpp create mode 100755 engine/CameraController.h create mode 100755 engine/Engine.cpp create mode 100755 engine/Engine.h create mode 100755 engine/Mesh.cpp create mode 100755 engine/Mesh.h create mode 100755 engine/Object.h create mode 100755 engine/Plane.cpp create mode 100755 engine/Plane.h create mode 100755 engine/ResourceManager.cpp create mode 100755 engine/ResourceManager.h create mode 100755 engine/Screen.cpp create mode 100755 engine/Screen.h create mode 100755 engine/Triangle.cpp create mode 100755 engine/Triangle.h create mode 100755 engine/World.cpp create mode 100755 engine/World.h create mode 100755 engine/animation/AColor.h create mode 100755 engine/animation/AFunction.h create mode 100755 engine/animation/ARotate.h create mode 100755 engine/animation/AScale.h create mode 100755 engine/animation/ATranslate.h create mode 100755 engine/animation/ATranslateToPoint.h create mode 100755 engine/animation/AWait.h create mode 100755 engine/animation/Animatable.cpp create mode 100755 engine/animation/Animatable.h create mode 100755 engine/animation/Animation.cpp create mode 100755 engine/animation/Animation.h create mode 100755 engine/animation/Interpolation.h create mode 100755 engine/fonts/Roboto-Light.ttf create mode 100755 engine/fonts/Roboto-Medium.ttf create mode 100755 engine/fonts/Roboto-Thin.ttf create mode 100755 engine/fonts/fontRU.ttf create mode 100755 engine/gui/Button.cpp create mode 100755 engine/gui/Button.h create mode 100755 engine/gui/Window.cpp create mode 100755 engine/gui/Window.h create mode 100755 engine/network/ClientUDP.cpp create mode 100755 engine/network/ClientUDP.h create mode 100755 engine/network/MsgType.cpp create mode 100755 engine/network/MsgType.h create mode 100755 engine/network/ReliableMsg.cpp create mode 100755 engine/network/ReliableMsg.h create mode 100755 engine/network/ServerUDP.cpp create mode 100755 engine/network/ServerUDP.h create mode 100755 engine/network/UDPConnection.cpp create mode 100755 engine/network/UDPConnection.h create mode 100755 engine/network/UDPSocket.cpp create mode 100755 engine/network/UDPSocket.h create mode 100755 engine/network/config.h create mode 100755 engine/network/connect.txt create mode 100755 engine/network/server.txt create mode 100755 engine/physics/RigidBody.cpp create mode 100755 engine/physics/RigidBody.h create mode 100755 engine/physics/Simplex.h create mode 100755 engine/physics/Solver.cpp create mode 100755 engine/physics/Solver.h create mode 100755 engine/utils/Log.cpp create mode 100755 engine/utils/Log.h create mode 100755 engine/utils/Matrix4x4.cpp create mode 100755 engine/utils/Matrix4x4.h create mode 100755 engine/utils/Point4D.cpp create mode 100755 engine/utils/Point4D.h create mode 100755 engine/utils/Time.cpp create mode 100755 engine/utils/Time.h create mode 100755 img/gamePlay2.png create mode 100755 img/gamePlay3.png create mode 100755 img/gamePlay4.png create mode 100755 img/gamePlay5.png create mode 100755 img/gamePlay6.png create mode 100755 img/gamePlay7.png create mode 100755 main.cpp create mode 100755 maps/map1.obj create mode 100755 maps/materials.txt create mode 100755 obj/ability.obj create mode 100755 obj/ability_mat.txt create mode 100755 obj/ak47.obj create mode 100755 obj/ak47_mat.txt create mode 100755 obj/cube.obj create mode 100755 obj/gold_ak47.obj create mode 100755 obj/gold_ak47_mat.txt create mode 100755 obj/gun.obj create mode 100755 obj/gun_mat.txt create mode 100755 obj/hill.obj create mode 100755 obj/hill_mat.txt create mode 100755 obj/rifle.obj create mode 100755 obj/rifle_mat.txt create mode 100755 obj/shotgun.obj create mode 100755 obj/shotgun_mat.txt create mode 100755 sound/backNoise.ogg create mode 100755 sound/classic_hurt.ogg create mode 100755 sound/click.ogg create mode 100755 sound/fallbig.ogg create mode 100755 sound/fullAbility.ogg create mode 100755 sound/fullHealth.ogg create mode 100755 sound/kill.ogg create mode 100755 sound/slow_mo.ogg create mode 100755 sound/stonestep1.ogg create mode 100755 sound/stonestep2.ogg create mode 100755 sound/stonestep3.ogg create mode 100755 sound/stonestep4.ogg create mode 100755 sound/stonestep5.ogg create mode 100755 sound/stonestep6.ogg create mode 100755 sound/unslow_mo.ogg create mode 100755 sound/weapons/ak47.ogg create mode 100755 sound/weapons/change_weapon.ogg create mode 100755 sound/weapons/gun.ogg create mode 100755 sound/weapons/no_ammo.ogg create mode 100755 sound/weapons/reload_ak47.ogg create mode 100755 sound/weapons/reload_gun.ogg create mode 100755 sound/weapons/reload_shotgun.ogg create mode 100755 sound/weapons/shotgun.ogg create mode 100755 textures/back.png create mode 100755 textures/gui.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..db66441 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +# Project exclude paths +/cmake-build-debug/ +/cmake-build-release/ \ No newline at end of file diff --git a/Ak47.cpp b/Ak47.cpp new file mode 100755 index 0000000..982d9dd --- /dev/null +++ b/Ak47.cpp @@ -0,0 +1,17 @@ +// +// Created by Иван Ильин on 02.06.2021. +// + +#include +#include "Ak47.h" + +using namespace std; + +Ak47::Ak47(int ammo, const std::string& weaponName) : Weapon(weaponName, "../obj/ak47.obj", "../obj/ak47_mat.txt", Point4D{3, 3, 3}, Point4D{-0.8, 1.3, 0.3}, Point4D{0, M_PI, 0}) { + fireSound.setBuffer(*ResourceManager::loadSoundBuffer("../sound/weapons/ak47.ogg")); + reloadSound.setBuffer(*ResourceManager::loadSoundBuffer("../sound/weapons/reload_ak47.ogg")); + + + _stockAmmo = ammo - _clipCapacity; + _fireDelay = 0.1; +} diff --git a/Ak47.h b/Ak47.h new file mode 100755 index 0000000..a9274b4 --- /dev/null +++ b/Ak47.h @@ -0,0 +1,16 @@ +// +// Created by Иван Ильин on 02.06.2021. +// + +#ifndef SHOOTER_AK47_H +#define SHOOTER_AK47_H + +#include "Weapon.h" + +class Ak47 : public Weapon { +public: + explicit Ak47(int ammo = 100, const std::string& weaponName = "ak47"); +}; + + +#endif //SHOOTER_3DZAVR_AK47_H diff --git a/Bonus.cpp b/Bonus.cpp new file mode 100755 index 0000000..91685e4 --- /dev/null +++ b/Bonus.cpp @@ -0,0 +1,13 @@ +// +// Created by Иван Ильин on 05.06.2021. +// + +#include "Bonus.h" + +Bonus::Bonus(const std::string &bonusName, const std::string &filename, const std::string &materials, const Point4D &scale) { + _name = bonusName; + loadObj(filename, materials, scale); + setCollider(false); + + a_rotate("a_rotation", Point4D{0, 2*M_PI, 0}, 4, Animation::Continue, Animation::linear); +} diff --git a/Bonus.h b/Bonus.h new file mode 100755 index 0000000..27aafc0 --- /dev/null +++ b/Bonus.h @@ -0,0 +1,21 @@ +// +// Created by Иван Ильин on 05.06.2021. +// + +#ifndef SHOOTER_BONUS_H +#define SHOOTER_BONUS_H + +#include "World.h" +#include "Player.h" + +class Bonus : public Mesh { +protected: + std::string _name; +public: + explicit Bonus(const std::string &bonusName, const std::string& filename, const std::string &materials = "", const Point4D& scale = Point4D{1, 1, 1}); + + [[nodiscard]] std::string name() const { return _name; } +}; + + +#endif //SHOOTER_3DZAVR_BONUS_H diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100755 index 0000000..c478e53 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,105 @@ +cmake_minimum_required(VERSION 3.17) +project(shooter) + +set(CMAKE_CXX_STANDARD 20) + +include_directories(engine) + +add_executable(shooter + # game: + main.cpp + Player.cpp + Player.h + Client.cpp + Client.h + Server.cpp + Server.h + Weapon.cpp + Weapon.h + Ak47.cpp + Ak47.h + Shotgun.cpp + Shotgun.h + Gun.cpp + Gun.h + Bonus.cpp + Bonus.h + Gold_Ak47.h + Rifle.cpp + Rifle.h + # 3d engine: + engine/utils/Time.h + engine/utils/Time.cpp + engine/utils/Point4D.h + engine/utils/Point4D.cpp + engine/utils/Matrix4x4.h + engine/utils/Matrix4x4.cpp + engine/Triangle.h + engine/Triangle.cpp + engine/Mesh.h + engine/Mesh.cpp + engine/utils/Log.h + engine/utils/Log.cpp + engine/ResourceManager.h + engine/ResourceManager.cpp + engine/World.h + engine/World.cpp + engine/Camera.h + engine/Camera.cpp + engine/Screen.h + engine/Screen.cpp + engine/Engine.h + engine/Engine.cpp + engine/Plane.h + engine/Plane.cpp + engine/CameraController.h + engine/CameraController.cpp + engine/animation/Animatable.h + engine/animation/Animation.h + engine/animation/Interpolation.h + engine/animation/Animatable.cpp + engine/animation/Animation.cpp + engine/animation/ATranslate.h + engine/animation/AScale.h + engine/animation/ARotate.h + engine/animation/AWait.h + engine/physics/RigidBody.cpp + engine/physics/RigidBody.h + engine/physics/Simplex.h + engine/physics/Solver.cpp + engine/physics/Solver.h + engine/Object.h + engine/gui/Button.cpp + engine/gui/Button.h + engine/gui/Window.cpp + engine/gui/Window.h + engine/network/ClientUDP.cpp + engine/network/ClientUDP.h + engine/network/MsgType.cpp + engine/network/MsgType.h + engine/network/ReliableMsg.cpp + engine/network/ReliableMsg.h + engine/network/ServerUDP.cpp + engine/network/ServerUDP.h + engine/network/UDPConnection.cpp + engine/network/UDPConnection.h + engine/network/UDPSocket.cpp + engine/network/UDPSocket.h + engine/network/config.h + engine/animation/AFunction.h + ) + +if(${APPLE}) + include_directories(/usr/local/include) +else() + set(SFML_DIR "C:/Libraries/SFML/lib/cmake/SFML") + set(SFML_STATIC_LIBRARIES TRUE) +endif() + +find_package(SFML 2.5.1 COMPONENTS graphics audio REQUIRED) + +if (SFML_FOUND) + include_directories(${SFML_INCLUDE_DIR}) +endif() + +target_link_libraries(shooter sfml-audio sfml-network sfml-graphics sfml-window sfml-system) \ No newline at end of file diff --git a/Client.cpp b/Client.cpp new file mode 100755 index 0000000..132822c --- /dev/null +++ b/Client.cpp @@ -0,0 +1,217 @@ +// +// Created by Иван Ильин on 25.05.2021. +// + +#include "Client.h" +#include "utils/Log.h" +#include "Bonus.h" + +void Client::updatePacket() { + sf::Packet packet; + packet << MsgType::ClientUpdate << _player->position().x() << _player->position().y() << _player->position().z() << _player->angle().y() << _player->camera()->angleLeftUpLookAt().x(); + _socket.send(packet, _socket.serverId()); +} + +void Client::processInit(sf::Packet& packet) { + sf::Uint16 targetId; + double buf[4]; + + while (packet >> targetId >> buf[0] >> buf[1] >> buf[2] >> buf[3]) + { + if(targetId != _socket.ownId()) { + std::string name = "Player_" + std::to_string(targetId); + _players.insert({ targetId, std::make_shared() }); + (*_world).addMesh(_players[targetId], name); + _players[targetId]->setVisible(true); + _players[targetId]->setAcceleration(Point4D{0, 0, 0}); + + // add head and other stuff: + _world->loadObj(name + "_head", "../obj/cube.obj", "",Point4D{0.7, 0.7, 0.7}); + (*_world)[name + "_head"]->translate(Point4D{0, 2, 0}); + (*_world)[name + "_head"]->setCollider(false); + _players[targetId]->attach((*_world)[name + "_head"]); + + _world->loadObj(name + "_eye1", "../obj/cube.obj", "",Point4D{0.2, 0.2, 0.05}); + (*_world)[name + "_eye1"]->translate(Point4D{0.3, 2.1, 0.7}); + (*_world)[name + "_eye1"]->setCollider(false); + (*_world)[name + "_eye1"]->setColor({147, 159, 255}); + (*_world)[name + "_head"]->attach((*_world)[name + "_eye1"]); + + _world->loadObj(name + "_eye2", "../obj/cube.obj", "",Point4D{0.2, 0.2, 0.05}); + (*_world)[name + "_eye2"]->translate(Point4D{-0.3, 2.1, 0.7}); + (*_world)[name + "_eye2"]->setCollider(false); + (*_world)[name + "_eye2"]->setColor({147, 159, 255}); + (*_world)[name + "_head"]->attach((*_world)[name + "_eye2"]); + + _players[targetId]->translateToPoint(Point4D{ buf[0], buf[1], buf[2]}); + _players[targetId]->setHealth(buf[3]); + } + } +} + +void Client::processUpdate(sf::Packet& packet) { + sf::Uint16 targetId; + double buf[6]; + + while (packet >> targetId >> buf[0] >> buf[1] >> buf[2] >> buf[3] >> buf[4] >> buf[5]) { + if (_players.count(targetId)) { + std::string name = "Player_" + std::to_string(targetId); + _players[targetId]->translateToPoint(Point4D{buf[0], buf[1], buf[2]}); + _players[targetId]->setHealth(buf[3]); + _players[targetId]->rotateToAngle(Point4D{0, buf[4], 0}); + //(*_world)[name + "_head"]->rotateToAngle({buf[5], 2*buf[4], 0}); + (*_world)[name + "_head"]->rotate(Matrix4x4::RotationY(buf[4]) * Point4D{1, 0, 0}, + buf[5] - _players[targetId]->headAngle()); + _players[targetId]->setHeadAngle(buf[5]); + } else if (targetId == _socket.ownId()) { + _player->setHealth(buf[3]); + } + } +} + +void Client::processNewClient(sf::Packet& packet) { + sf::Uint16 targetId; + + packet >> targetId; + + std::string name = "Player_" + std::to_string(targetId); + _players.insert({ targetId, std::make_shared() }); + _world->addMesh(_players[targetId], name); + _players[targetId]->setVisible(true); + _players[targetId]->setAcceleration(Point4D{0, 0, 0}); + + // add head and other stuff: + _world->loadObj(name + "_head", "../obj/cube.obj","",Point4D{0.7, 0.7, 0.7}); + (*_world)[name + "_head"]->translate(Point4D{0, 2, 0}); + (*_world)[name + "_head"]->setCollider(false); + _players[targetId]->attach((*_world)[name + "_head"]); + + _world->loadObj(name + "_eye1", "../obj/cube.obj","",Point4D{0.2, 0.2, 0.05}); + (*_world)[name + "_eye1"]->translate(Point4D{0.3, 2.1, 0.7}); + (*_world)[name + "_eye1"]->setCollider(false); + (*_world)[name + "_eye1"]->setColor({147, 159, 255}); + (*_world)[name + "_head"]->attach((*_world)[name + "_eye1"]); + + _world->loadObj(name + "_eye2", "../obj/cube.obj", "",Point4D{0.2, 0.2, 0.05}); + (*_world)[name + "_eye2"]->translate(Point4D{-0.3, 2.1, 0.7}); + (*_world)[name + "_eye2"]->setCollider(false); + (*_world)[name + "_eye2"]->setColor({147, 159, 255}); + (*_world)[name + "_head"]->attach((*_world)[name + "_eye2"]); +} + +void Client::processDisconnect(sf::Uint16 targetId) { + if (targetId != _socket.ownId() && _players.count(targetId)) { + std::string name = "Player_" + std::to_string(targetId); + _world->removeMesh(name); + _world->removeMesh(name + "_head"); + _world->removeMesh(name + "_eye1"); + _world->removeMesh(name + "_eye2"); + + _players.erase(targetId); + } +} + + +void Client::processCustomPacket(MsgType type, sf::Packet& packet) { + int buff[3]; + sf::Uint16 buffId[2]; + double dbuff[10]; + std::string tmp, tmp2; + Point4D p1, p2; + + switch (type) { + case MsgType::Kill: + packet >> buffId[0] >> buffId[1]; + if(buffId[0] == _socket.ownId()) { + _player->addDeath(); + // respawn + _player->translateToPoint(Point4D{50.0*(-1 + 2.0*(double)rand()/RAND_MAX),30.0*(double)rand()/RAND_MAX,50.0*(-1 + 2.0*(double)rand()/RAND_MAX)}); + _player->playDeath(); + _player->initWeapons(); + _player->setFullAbility(); + } + else + _players[buffId[0]]->addDeath(); + if(buffId[1] == _socket.ownId()) { + _player->addKill(); + _player->playKill(); + } + else + _players[buffId[1]]->addKill(); + break; + case MsgType::FireTrace: + packet >> dbuff[0] >> dbuff[1] >> dbuff[2] >> dbuff[3] >> dbuff[4] >> dbuff[5]; + + p1 = Point4D(dbuff[0], dbuff[1], dbuff[2]); + p2 = Point4D(dbuff[3], dbuff[4], dbuff[5]); + + tmp = "Client_fireTraces_" + std::to_string(fireTraces++); + _world->addMesh(std::make_shared(Mesh::LineTo(p1, p2, 0.05)), tmp); + (*_world)[tmp]->setCollider(false); + + (*_world)[tmp]->a_color(tmp + "_fadeOut", {255, 255, 255, 0}, 1, Animation::None, Animation::linear); + (*_world)["Player_im"]->a_function(tmp + "delete", [this, tmp](){ deleteTrace(_world, tmp); }, 1, 2); + + break; + case MsgType::InitBonuses: + while (packet >> tmp >> dbuff[0] >> dbuff[1] >> dbuff[2]) { + tmp2 = tmp.substr(6, tmp.size()-3-5); + _world->addMesh(std::make_shared(tmp, "../obj/" + tmp2 + ".obj", "../obj/" + tmp2 + "_mat.txt", Point4D{3, 3, 3}), tmp); + (*_world)[tmp]->translateToPoint(Point4D(dbuff[0], dbuff[1], dbuff[2])); + } + break; + + case MsgType::AddBonus: + packet >> tmp >> dbuff[0] >> dbuff[1] >> dbuff[2]; + + tmp2 = tmp.substr(6, tmp.size()-3-5); + _world->addMesh(std::make_shared(tmp, "../obj/" + tmp2 + ".obj", "../obj/" + tmp2 + "_mat.txt", Point4D{3, 3, 3}), tmp); + (*_world)[tmp]->translateToPoint(Point4D(dbuff[0], dbuff[1], dbuff[2])); + + break; + case MsgType::RemoveBonus: + packet >> tmp; + _world->removeMesh(tmp); + break; + } +} + +void Client::processDisconnected() { + for (auto it = _players.begin(); it != _players.end();) { + std::string name = "Player_" + std::to_string(it->first); + + _world->removeMesh(name); + _world->removeMesh(name + "_head"); + _world->removeMesh(name + "_eye1"); + _world->removeMesh(name + "_eye2"); + _players.erase(it++); + } +} + +void Client::damagePlayer(sf::Uint16 targetId, double damage) { + sf::Packet packet; + + packet << MsgType::Damage << targetId << damage; + _socket.send(packet, _socket.serverId()); + + Log::log("Client: damagePlayer " + std::to_string(targetId) + " ( -" + std::to_string(damage) + "hp )"); +} + +void Client::addTrace(const Point4D& from, const Point4D& to) { + sf::Packet packet; + + packet << MsgType::FireTrace << from.x() << from.y() << from.z() << to.x() << to.y() << to.z(); + _socket.send(packet, _socket.serverId()); +} + +void Client::deleteTrace(const std::shared_ptr &world, const std::string &traceName) { + world->removeMesh(traceName); +} + +void Client::takeBonus(const std::string& bonusName) { + sf::Packet packet; + + packet << MsgType::RemoveBonus << bonusName; + _socket.send(packet, _socket.serverId()); +} + diff --git a/Client.h b/Client.h new file mode 100755 index 0000000..79ebb77 --- /dev/null +++ b/Client.h @@ -0,0 +1,45 @@ +// +// Created by Иван Ильин on 25.05.2021. +// + +#ifndef SHOOTER_CLIENT_H +#define SHOOTER_CLIENT_H + +#include + +#include "network/ClientUDP.h" +#include "Player.h" + +class Client : public ClientUDP { +private: + std::shared_ptr _player; + std::shared_ptr _world; + + std::map> _players{}; + + int fireTraces = 0; +public: + Client(std::shared_ptr player, std::shared_ptr world) : _player(std::move(player)), _world(std::move(world)) {}; + + void updatePacket() override; + + void processInit(sf::Packet& packet) override; + void processUpdate(sf::Packet& packet) override; + void processNewClient(sf::Packet& packet) override; + void processDisconnect(sf::Uint16 targetId) override; + + void processCustomPacket(MsgType type, sf::Packet& packet) override; + + void processDisconnected() override; + + void damagePlayer(sf::Uint16 targetId, double damage); + + void takeBonus(const std::string& bonusName); + + void addTrace(const Point4D& from, const Point4D& to); + + void deleteTrace(const std::shared_ptr &world, const std::string& traceName); +}; + + +#endif //MINECRAFT_3DZAVR_CLIENT_H diff --git a/Gold_Ak47.h b/Gold_Ak47.h new file mode 100755 index 0000000..971d0ad --- /dev/null +++ b/Gold_Ak47.h @@ -0,0 +1,27 @@ +// +// Created by Иван Ильин on 05.06.2021. +// + +#ifndef SHOOTER_GOLD_AK47_H +#define SHOOTER_GOLD_AK47_H + +#include "Weapon.h" + +class Gold_Ak47 : public Weapon { +public: + explicit Gold_Ak47(int ammo = 200, const std::string& weaponName = "gold_ak47") : Weapon(weaponName, "../obj/ak47.obj", "../obj/gold_ak47_mat.txt", Point4D{3, 3, 3}, Point4D{-0.8, 1.3, 0.3}, Point4D{0, M_PI, 0}) { + fireSound.setBuffer(*ResourceManager::loadSoundBuffer("../sound/weapons/ak47.ogg")); + reloadSound.setBuffer(*ResourceManager::loadSoundBuffer("../sound/weapons/reload_ak47.ogg")); + + _initialPack = 200; + _spreading = 1.0; + _reloadTime = 1.5; + _clipCapacity = 60; + _stockAmmo = ammo - _clipCapacity; + _fireDelay = 0.05; + _damage = 600; + _clipAmmo = _clipCapacity; + } +}; + +#endif //SHOOTER_3DZAVR_GOLD_AK47_H diff --git a/Gun.cpp b/Gun.cpp new file mode 100755 index 0000000..4d31298 --- /dev/null +++ b/Gun.cpp @@ -0,0 +1,22 @@ +// +// Created by Иван Ильин on 03.06.2021. +// + +#include +#include "Gun.h" + +using namespace std; + +Gun::Gun(int ammo, const std::string& weaponName) : Weapon(weaponName, "../obj/gun.obj", "../obj/gun_mat.txt", Point4D{3, 3, 3}, Point4D{-0.8, 1.3, 0.3}, Point4D{0, M_PI, 0}) { + fireSound.setBuffer(*ResourceManager::loadSoundBuffer("../sound/weapons/gun.ogg")); + reloadSound.setBuffer(*ResourceManager::loadSoundBuffer("../sound/weapons/reload_gun.ogg")); + + _initialPack = 30; + _clipCapacity = 6; // how much ammo can be stored in one clip + _stockAmmo = ammo - _clipCapacity; // how much ammo do you have in stock + _clipAmmo = _clipCapacity; // how much ammo do you have in current clip + _reloadTime = 2; + _fireDelay = 0.3; // time delay between fires + _damage = 800; + _spreading = 3.0; +} diff --git a/Gun.h b/Gun.h new file mode 100755 index 0000000..db5a25a --- /dev/null +++ b/Gun.h @@ -0,0 +1,16 @@ +// +// Created by Иван Ильин on 03.06.2021. +// + +#ifndef SHOOTER_GUN_H +#define SHOOTER_GUN_H + +#include "Weapon.h" + +class Gun : public Weapon { +public: + explicit Gun(int ammo = 30, const std::string& weaponName = "gun"); +}; + + +#endif //SHOOTER_3DZAVR_GUN_H diff --git a/Player.cpp b/Player.cpp new file mode 100755 index 0000000..46b8b3a --- /dev/null +++ b/Player.cpp @@ -0,0 +1,343 @@ +// +// Created by Иван Ильин on 14.03.2021. +// + +#include "Player.h" +#include "Screen.h" +#include "ResourceManager.h" +#include "utils/Log.h" + +void Player::update() { + + if(inCollision()) + p_velocity -= p_velocity*Time::deltaTime()*2; + + if(isInSlowMo) { + if(_ability > 0) + _ability -= Time::deltaTime(); + else { + _ability = 0; + isInSlowMo = false; + setVelocity(velocity()*slowMoCoefficient); + setAcceleration(p_acceleration*slowMoCoefficient*slowMoCoefficient); + slowMoSound.stop(); + unSlowMoSound.play(); + } + } + + double coeff = isInSlowMo ? 1.0/slowMoCoefficient : 1.0; + + bool inRunning_old = inRunning; + inRunning = _screen != nullptr && (Screen::isKeyPressed(sf::Keyboard::A) || Screen::isKeyPressed(sf::Keyboard::D) ||Screen::isKeyPressed(sf::Keyboard::W) || Screen::isKeyPressed(sf::Keyboard::S)); + + // in case when the camera is attached we make some animation during running + if(_camera != nullptr && inRunning && !_camera->isInAnim()) { + _camera->a_translate("hor_oscil", -_camera->left()/12, 0.3/coeff, Animation::LoopOut::None, Animation::cos); + _camera->a_wait("hor_oscil", 0); + _camera->a_translate("hor_oscil", _camera->left()/12, 0.3/coeff, Animation::LoopOut::None, Animation::cos); + + _camera->a_translate("vert_oscil", -Point4D{0, 1, 0}/24, 0.15/coeff, Animation::LoopOut::None, Animation::cos); + _camera->a_wait("vert_oscil", 0); + _camera->a_translate("vert_oscil", Point4D{0, 1, 0}/24, 0.15/coeff, Animation::LoopOut::None, Animation::cos); + _camera->a_wait("vert_oscil", 0); + _camera->a_translate("vert_oscil", -Point4D{0, 1, 0}/24, 0.15/coeff, Animation::LoopOut::None, Animation::cos); + _camera->a_wait("vert_oscil", 0); + _camera->a_translate("vert_oscil", Point4D{0, 1, 0}/24, 0.15/coeff, Animation::LoopOut::None, Animation::cos); + + _camera->a_translateToPoint("init", position() + Point4D{0, 1.8, 0}, 0.3/coeff, Animation::None, Animation::cos); + + } else if(_camera != nullptr && inRunning_old && !inRunning) { + _camera->a_stopAllAnimations(); + + _camera->a_translateToPoint("init", position() + Point4D{0, 1.8, 0}, 0.15/coeff, Animation::None, Animation::cos); + } + + auto rayToFloor = (*_world).rayCast(position(), position() + Point4D{0, -5, 0}); + + if(_world != nullptr && _screen != nullptr && _camera != nullptr) { + // Left and right + if (Screen::isKeyPressed(sf::Keyboard::A)) { + translate(_camera->left() * Time::deltaTime() * walkSpeed * coeff); + if(inCollision()) + setVelocity(Point4D{0,0,0}); + } + if (Screen::isKeyPressed(sf::Keyboard::D)) { + translate(-_camera->left() * Time::deltaTime() * walkSpeed * coeff); + if(inCollision()) + setVelocity(Point4D{0,0,0}); + } + + // Forward and backward + if (Screen::isKeyPressed(sf::Keyboard::W)) { + translate(_camera->left().cross3D(Point4D{0, 1, 0}) * Time::deltaTime() * walkSpeed * coeff); + if(inCollision()) + setVelocity(Point4D{0,0,0}); + } + + if (Screen::isKeyPressed(sf::Keyboard::S)) { + translate(-_camera->left().cross3D(Point4D{0, 1, 0}) * Time::deltaTime() * walkSpeed * coeff); + + if(inCollision()) + setVelocity(Point4D{0,0,0}); + } + + if (_ability > 0 && !isInSlowMo && Screen::isKeyPressed(sf::Keyboard::LShift)) { + // slow mo + isInSlowMo = true; + setVelocity(velocity()/slowMoCoefficient); + setAcceleration(p_acceleration/(slowMoCoefficient*slowMoCoefficient)); + unSlowMoSound.stop(); + slowMoSound.play(); + } else if (isInSlowMo && !Screen::isKeyPressed(sf::Keyboard::LShift)) { + isInSlowMo = false; + setVelocity(velocity()*slowMoCoefficient); + setAcceleration(p_acceleration*slowMoCoefficient*slowMoCoefficient); + slowMoSound.stop(); + unSlowMoSound.play(); + } + + if (Screen::isKeyPressed(sf::Keyboard::Space) && inCollision()) { + addVelocity(Point4D{0, std::abs(_collisionNormal.y())*sqrt(2 * g * jumpHeight)*coeff, 0}); + translate(Point4D{0, Time::deltaTime() * walkSpeed * 2 * coeff, 0}); + } + + // Mouse movement + Point4D disp = _screen->getMouseDisplacement(); + + rotate(Point4D{0, -disp.x() / 1000.0, 0}); + p_velocity = Matrix4x4::RotationY(-disp.x() / 1000.0)*p_velocity; + + double rotationLeft = disp.y() / 1000.0; + + // You can only see in range [-90 : 90] grad + if (_camera->angleLeftUpLookAt().x() + rotationLeft > M_PI / 2) + rotationLeft = M_PI / 2 - _camera->angleLeftUpLookAt().x(); + if (_camera->angleLeftUpLookAt().x() + rotationLeft < -M_PI / 2) + rotationLeft = -M_PI / 2 - _camera->angleLeftUpLookAt().x(); + + _camera->rotateLeft(rotationLeft); + rotateWeaponsRelativePoint(position() + Point4D{0, 1.8, 0}, _camera->left(), rotationLeft); + + if (_screen->isKeyTapped(sf::Keyboard::Right) || _screen->isKeyTapped(sf::Keyboard::E)) { + if(_weapons.size() > 1) { + // change '_selectedWeapon' + _weapons[_selectedWeapon]->removeFromWorld(_world); + _selectedWeapon = (_selectedWeapon + 1) % _weapons.size(); + _weapons[_selectedWeapon]->addToWorld(_world); + Log::log("selected _selectedWeapon " + std::to_string(_selectedWeapon)); + changeWeaponSound.play(); + } + } + + if (_screen->isKeyTapped(sf::Keyboard::Left) || _screen->isKeyTapped(sf::Keyboard::Q)) { + if(_weapons.size() > 1) { + // change '_selectedWeapon' + _weapons[_selectedWeapon]->removeFromWorld(_world); + if (_selectedWeapon > 0) + _selectedWeapon = (_selectedWeapon - 1) % _weapons.size(); + else + _selectedWeapon = _weapons.size() - 1; + _weapons[_selectedWeapon]->addToWorld(_world); + Log::log("selected _selectedWeapon " + std::to_string(_selectedWeapon)); + changeWeaponSound.play(); + } + } + + if (_screen->isButtonPressed(sf::Mouse::Button::Left)) { + auto damagedPlayers = _weapons[_selectedWeapon]->fire(_world, _camera); + for(auto& damagedPlayer : damagedPlayers) { + sf::Uint16 targetId = std::stoi(damagedPlayer.first.substr(7)); + damagePlayerCallBack(targetId, damagedPlayer.second); + } + } + + if(Screen::isKeyPressed(sf::Keyboard::R)) { + _weapons[_selectedWeapon]->reload(); + } + + if (inRunning && inCollision() && walkSound.getStatus() != sf::Sound::Status::Playing) { + if ((position() - rayToFloor.first).abs() < 2) { + int soundNum = round((double) rand() / RAND_MAX * 5) + 1; + walkSound.setBuffer(*ResourceManager::loadSoundBuffer("../sound/stonestep" + std::to_string(soundNum) + ".ogg")); + //walkSound.setVolume(30); + walkSound.play(); + } + } + } + + oldVelocity = velocity(); +} + +void Player::rotateWeaponsRelativePoint(const Point4D& point4D, const Point4D& v, double val) { + for(auto& weapon : _weapons) + weapon->rotateRelativePoint(point4D, v, val); +} + +void Player::drawStats() { + + if(_screen == nullptr) + return; + + // health bar + int xPos = 10; + int yPos = _screen->height() - 10 - 10; + + int width = _screen->width()/2 - 20; + int height = 10; + + sf::ConvexShape polygon1; + polygon1.setPointCount(4); + sf::ConvexShape polygon2; + polygon2.setPointCount(4); + + polygon1.setPoint(0, sf::Vector2f((float)xPos, (float)yPos)); + polygon1.setPoint(1, sf::Vector2f((float)(xPos + width), (float)yPos)); + polygon1.setPoint(2, sf::Vector2f((float)(xPos + width), (float)(yPos + height))); + polygon1.setPoint(3, sf::Vector2f((float)xPos, (float)(yPos + height))); + + polygon2.setPoint(0, sf::Vector2f((float)xPos, (float)yPos)); + polygon2.setPoint(1, sf::Vector2f((float)xPos + width * _health / _healthMax, (float)yPos)); + polygon2.setPoint(2, sf::Vector2f((float)xPos + width * _health / _healthMax, (float)(yPos + height))); + polygon2.setPoint(3, sf::Vector2f((float)xPos, (float)(yPos + height))); + + polygon1.setFillColor({ 255, 174, 174, 100 }); + polygon2.setFillColor({ static_cast((_healthMax - _health)/_healthMax * 255), static_cast(_health * 255 / _healthMax), 0, 100 }); + + polygon1.setOutlineThickness(3); + _screen->window.draw(polygon2); + + // ability bar + sf::ConvexShape polygon3; + polygon3.setPointCount(4); + polygon3.setPoint(0, sf::Vector2f((float)xPos, (float)yPos - 15)); + polygon3.setPoint(1, sf::Vector2f((float)xPos + width * _ability / _abilityMax, (float)yPos - 15)); + polygon3.setPoint(2, sf::Vector2f((float)xPos + width * _ability / _abilityMax, (float)(yPos - 15 + height))); + polygon3.setPoint(3, sf::Vector2f((float)xPos, (float)(yPos - 15 + height))); + polygon3.setFillColor({ 255, 168, 168, 100 }); + _screen->window.draw(polygon3); + + // ammo + sf::Text text_health; + + text_health.setFont(*ResourceManager::loadFont("../engine/fonts/Roboto-Medium.ttf")); + + // text health + text_health.setCharacterSize(20); + text_health.setFillColor(sf::Color::White); + text_health.setStyle(sf::Text::Italic); + text_health.setPosition(0, 0); + + text_health.setString(std::to_string((int)_health)); + + // text ammo + sf::Text text_ammo1(text_health); + sf::Text text_ammo2(text_health); + + int ammo1Size = 100; + int ammo2Size = 50; + + auto balance = _weapons[_selectedWeapon]->balance(); + + text_ammo1.setCharacterSize(ammo1Size); + text_ammo1.setString(std::to_string((int)balance.first)); + text_ammo1.setPosition(150, _screen->height() - 50 - ammo1Size); + text_ammo1.setFillColor(sf::Color(0, 0, 0, 100)); + _screen->window.draw(text_ammo1); + + text_ammo2.setCharacterSize(ammo2Size); + text_ammo2.setString(std::to_string((int)balance.second)); + text_ammo2.setPosition(50, _screen->height() - 50 - ammo2Size); + text_ammo2.setFillColor(sf::Color(0, 0, 0, 70)); + _screen->window.draw(text_ammo2); + + // text killSound/deathSound stats + sf::Text text_kills(text_health); + text_kills.setStyle(sf::Text::Bold); + text_kills.setString("KILLS: " + std::to_string((int)_kills) + " | " + "DEATHS: " + std::to_string((int)_deaths)); + text_kills.setFillColor(sf::Color(0, 0, 0, 100)); + text_kills.setCharacterSize(ammo2Size/2); + text_kills.setPosition(10, 10); + + _screen->window.draw(text_kills); + + sf::Text text_deaths(text_health); + + text_deaths.setString(std::to_string((int)_deaths)); + text_deaths.setFillColor(sf::Color(100, 0, 0, 100)); + text_deaths.setCharacterSize(ammo2Size); + text_deaths.setPosition(10, ammo2Size + 10); +} + +void Player::playDeath() { + deathSound.setBuffer(*ResourceManager::loadSoundBuffer("../sound/classic_hurt.ogg")); + deathSound.play(); +} + +void Player::playKill() { + killSound.setBuffer(*ResourceManager::loadSoundBuffer("../sound/kill.ogg")); + killSound.play(); +} + +void Player::collisionWithObject(const std::string &objName, const std::shared_ptr &obj) { + if(objName.find("Bonus_gun") != std::string::npos) + addWeapon(std::make_shared()); + + if(objName.find("Bonus_shotgun") != std::string::npos) + addWeapon(std::make_shared()); + + if(objName.find("Bonus_ak47") != std::string::npos) + addWeapon(std::make_shared()); + + if(objName.find("Bonus_gold_ak47") != std::string::npos) + addWeapon(std::make_shared()); + + if(objName.find("Bonus_rifle") != std::string::npos) + addWeapon(std::make_shared()); + + if(objName.find("Bonus_hill") != std::string::npos) + setFullHealth(); + + if(objName.find("Bonus_ability") != std::string::npos) + setFullAbility(); + + if(objName.find("Bonus") != std::string::npos) { + _world->removeMesh(objName); + takeBonusCallBack(objName); + } +} + +void Player::addWeapon(const std::shared_ptr &weapon) { + changeWeaponSound.play(); + + if(!_weapons.empty()) { + for(auto& w : _weapons) { + if (w->name() == weapon->name()) { + w->addAmmo(w->initialPack()); + return; + } + } + } + + _weapons.push_back(weapon); + _weapons.back()->attachToPlayer(*this); + + _weapons.back()->translate(position()); + _weapons.back()->rotateRelativePoint(position() + Point4D{0, 1.8, 0}, Point4D{0, 1, 0}, p_angle.y()); + _weapons.back()->rotateRelativePoint(position() + Point4D{0, 1.8, 0}, _camera->left(), _camera->angleLeftUpLookAt().x()); + + _weapons.back()->setAddTraceCallBack(addTraceCallBack); + changeWeaponSound.play(); +} + +void Player::initWeapons() { + + if(!_weapons.empty()) { + _weapons[_selectedWeapon]->removeFromWorld(_world); + _weapons.clear(); + } + + _selectedWeapon = 0; + addWeapon(std::make_shared()); + + _weapons[_selectedWeapon]->addToWorld(_world); +} diff --git a/Player.h b/Player.h new file mode 100755 index 0000000..3cdcc73 --- /dev/null +++ b/Player.h @@ -0,0 +1,165 @@ +// +// Created by Иван Ильин on 14.03.2021. +// + +#ifndef SHOOTER_PLAYER_H +#define SHOOTER_PLAYER_H + +#include +#include +#include +#include "Mesh.h" +#include "Camera.h" +#include "World.h" +#include "Ak47.h" +#include "Shotgun.h" +#include "Gun.h" +#include "Gold_Ak47.h" +#include "Rifle.h" + +class Player : public Mesh{ +private: + double _healthMax = 100; + double _health = _healthMax; + + double _abilityMax = 10; + double _ability = _abilityMax; + + double jumpHeight = 3; + double walkSpeed = 10; + double _headAngle = 0; + + unsigned _kills = 0; + unsigned _deaths = 0; + + double g = 35; + + double slowMoCoefficient = 5; + bool isInSlowMo = false; + + std::shared_ptr _camera; + std::shared_ptr _screen; + + std::shared_ptr _world; + + bool inRunning = false; + + // sounds + sf::Sound killSound; + sf::Sound deathSound; + sf::Sound walkSound; + sf::Sound changeWeaponSound; + sf::Sound slowMoSound; + sf::Sound unSlowMoSound; + sf::Sound fullHealthSound; + sf::Sound fullAbilitySound; + + + Point4D oldVelocity; + + std::string _name = "im"; + + std::vector> _weapons; + uint8_t _selectedWeapon = 0; + + std::function damagePlayerCallBack; + std::function addTraceCallBack; + std::function takeBonusCallBack; + + +public: + Player() { + loadObj("../obj/cube.obj", "", Point4D{0.5, 1.9, 0.5}); + setAcceleration(Point4D{0, -g, 0}); + setCollision(true); + setVisible(false); + setColor({240, 168, 168}); + }; + + void update(); + + void attachCamera(std::shared_ptr& camera, std::shared_ptr screen) { + _camera = camera; + _screen = std::move(screen); + + camera->translateToPoint(position() + Point4D{0, 1.8, 0}); + this->attach(camera); + } + + void attachWorld(const std::shared_ptr& world, const Point4D& pos = Point4D{0, 30, 0}) { + _world = world; + + translate(pos); + + initWeapons(); + + changeWeaponSound.setBuffer(*ResourceManager::loadSoundBuffer("../sound/weapons/change_weapon.ogg")); + + slowMoSound.setBuffer(*ResourceManager::loadSoundBuffer("../sound/slow_mo.ogg")); + unSlowMoSound.setBuffer(*ResourceManager::loadSoundBuffer("../sound/unslow_mo.ogg")); + + fullHealthSound.setBuffer(*ResourceManager::loadSoundBuffer("../sound/fullHealth.ogg")); + fullAbilitySound.setBuffer(*ResourceManager::loadSoundBuffer("../sound/fullAbility.ogg")); + + setCollisionCallBack([this](const std::string& objName, const std::shared_ptr& obj) {collisionWithObject(objName, obj);}); + } + + void setHealth(double h) { + _health = h; + } + void setAbility(double a) { + _ability = a; + } + + void setFullHealth() { + _health = _healthMax; + fullHealthSound.play(); + } + void setFullAbility() { + _ability = _abilityMax; + fullAbilitySound.play(); + } + + + void setDamagePlayerCallBack(std::function hit) { + damagePlayerCallBack = std::move(hit); + } + + void setAddTraceCallBack(std::function add) { + addTraceCallBack = std::move(add); + } + + void setTakeBonusCallBack(std::function take) { + takeBonusCallBack = std::move(take); + } + + [[nodiscard]] double health() const { return _health; } + [[nodiscard]] std::string name() const { return "Player_" + _name; } + + + std::shared_ptr camera() { return _camera; } + + // This is for situation when you want to store the position of the head but you dont have attached camera + void setHeadAngle(double a) { _headAngle = a; } + [[nodiscard]] double headAngle() const { return _headAngle; }; + + void rotateWeaponsRelativePoint(const Point4D& point4D, const Point4D& v, double val); + + + void drawStats(); + + void addKill() { _kills++; } + void addDeath() { _deaths++; } + + void playDeath(); + void playKill(); + + void collisionWithObject(const std::string& objName, const std::shared_ptr& obj); + + void addWeapon(const std::shared_ptr& weapon); + + void initWeapons(); +}; + + +#endif //MINECRAFT_3DZAVR_PLAYER_H diff --git a/README.md b/README.md new file mode 100755 index 0000000..f7f1815 --- /dev/null +++ b/README.md @@ -0,0 +1,71 @@ +# Shooter on self-written 3D engine + +

About:

+ +Source code of simple shooter on [3Dzavr game engine](https://github.com/vectozavr/3dzavr) + +![Project demonstration](img/gamePlay2.png) + + +

Installation (Windows):

+1) Download and install .exe file + + download game: https://drive.google.com/file/d/1_8zUCwxyC-eLbqswM7OBXoNIAdzpUrkI/view + + +2) Write ip and port of server in bin/connect.txt file. + + +3) Write port of the server in bin/server.txt file (only for computer where the server will be running). + + +3) Enjoy gaming! + +

Control:

+ +SHIFT - slow motion (this ability is not infinite: its bar is next to hp) + +E & Q or keys <- -> - change weapon + +R - recharge + +Player control is standard. + +

Research source code:

+ +1) Download and install OpenAL library for SFML sound support (in current version you can't setup this engine without OpenAL) + + openal: https://openal.org/downloads/ + + +2) Install SFML on your computer (The compiler versions have to match 100%): + + sfml: https://www.sfml-dev.org/download.php + + +2) Open CLion or Visual Studio + + CLion (recommended): https://www.jetbrains.com/clion/ + + Visual Studio: https://visualstudio.microsoft.com/ru/ + + +3) Clone this repository + + rep url: https://github.com/vectozavr/shooter + + +4) Built project + +For any issues, please, create new issue in this repository. + +Demos: + +Online: +![Project demonstration](img/gamePlay4.png) + +GamePlay: +![Project demonstration](img/gamePlay3.png) +![Project demonstration](img/gamePlay5.png) +![Project demonstration](img/gamePlay6.png) +![Project demonstration](img/gamePlay7.png) diff --git a/Rifle.cpp b/Rifle.cpp new file mode 100755 index 0000000..79d30ed --- /dev/null +++ b/Rifle.cpp @@ -0,0 +1,20 @@ +// +// Created by Иван Ильин on 06.06.2021. +// + +#include +#include "Rifle.h" + +Rifle::Rifle(int ammo, const std::string &weaponName) : Weapon(weaponName, "../obj/rifle.obj", "../obj/rifle_mat.txt", Point4D{3, 3, 3}, Point4D{-1.2, 1, 0.3}, Point4D{0, M_PI, 0}) { + fireSound.setBuffer(*ResourceManager::loadSoundBuffer("../sound/weapons/shotgun.ogg")); + reloadSound.setBuffer(*ResourceManager::loadSoundBuffer("../sound/weapons/reload_ak47.ogg")); + + _initialPack = 5; + _clipCapacity = 1; // how much ammo can be stored in one clip + _stockAmmo = ammo - _clipCapacity; // how much ammo do you have in stock + _clipAmmo = _clipCapacity; // how much ammo do you have in current clip + _reloadTime = 1; + _fireDelay = 1; // time delay between fires + _damage = 30000; + _spreading = 0.5; +} diff --git a/Rifle.h b/Rifle.h new file mode 100755 index 0000000..eb1e269 --- /dev/null +++ b/Rifle.h @@ -0,0 +1,16 @@ +// +// Created by Иван Ильин on 06.06.2021. +// + +#ifndef SHOOTER_RIFLE_H +#define SHOOTER_RIFLE_H + +#include "Weapon.h" + +class Rifle : public Weapon { +public: + explicit Rifle(int ammo = 5, const std::string& weaponName = "rifle"); +}; + + +#endif //SHOOTER_3DZAVR_RIFLE_H diff --git a/Server.cpp b/Server.cpp new file mode 100755 index 0000000..6df97ea --- /dev/null +++ b/Server.cpp @@ -0,0 +1,166 @@ +// +// Created by Иван Ильин on 25.05.2021. +// + +#include "Server.h" +#include "utils/Log.h" + +void Server::broadcast() { + sf::Packet updatePacket; + updatePacket << MsgType::Update; + + for (auto& player : _players) + { + //player.second->setHealth(player.second->health() + (Time::time() - _lastBroadcast)/100); + updatePacket << player.first << player.second->position().x() << player.second->position().y() << player.second->position().z() << player.second->health() << player.second->angle().y() << player.second->headAngle(); + } + + for (auto& player : _players) + { + _socket.send(updatePacket, player.first); + } +} + + +void Server::processConnect(sf::Uint16 targetId) { + sf::Packet sendPacket1, sendPacket2; + sf::Packet extraPacket; + + // players init + extraPacket << MsgType::NewClient << targetId; + sendPacket1 << MsgType::Init << targetId; + _players.insert({ targetId, std::make_shared() }); + for (const auto& player : _players) + { + sendPacket1 << player.first << player.second->position().x() << player.second->position().y() << player.second->position().z() << player.second->health(); + if (player.first != targetId) + _socket.sendRely(extraPacket, player.first); + } + _socket.sendRely(sendPacket1, targetId); + + + // bonuses init + sendPacket2 << MsgType::InitBonuses; + for(auto& bonus : _bonuses) { + if(bonus.second.onTheMap) + sendPacket2 << bonus.first << bonus.second.position.x() << bonus.second.position.y() << bonus.second.position.z(); + } + _socket.sendRely(sendPacket2, targetId); + +} + +void Server::processClientUpdate(sf::Uint16 senderId, sf::Packet& packet) { + double buf[5]; + + packet >> buf[0] >> buf[1] >> buf[2] >> buf[3] >> buf[4]; + _players.at(senderId)->translateToPoint(Point4D{ buf[0], buf[1], buf[2] }); + _players.at(senderId)->rotateToAngle(Point4D{0, buf[3], 0}); + _players.at(senderId)->setHeadAngle(buf[4]); +} + +void Server::processDisconnect(sf::Uint16 senderId) { + sf::Packet sendPacket; + + sendPacket << MsgType::Disconnect << senderId; + _players.erase(senderId); + for (const auto& player : _players) + _socket.sendRely(sendPacket, player.first); +} + + +void Server::processCustomPacket(MsgType type, sf::Packet& packet, sf::Uint16 senderId) { + sf::Packet sendPacket; + int buff[3]; + double dbuff[10]; + sf::Uint16 targetId; + double damage; + std::string tmp; + double newHealth; + + switch (type) { + case MsgType::Damage: + packet >> targetId >> damage; + newHealth = _players[targetId]->health() - damage; + if(newHealth > 0) { + _players[targetId]->setHealth(newHealth); + } + else { + _players[targetId]->setFullHealth(); + _players[targetId]->setFullAbility(); + _players[targetId]->addDeath(); + _players[senderId]->addKill(); + + sendPacket << MsgType::Kill << targetId << senderId; + for (auto& player : _players) + _socket.send(sendPacket, player.first); + } + break; + case MsgType::FireTrace: + packet >> dbuff[0] >> dbuff[1] >> dbuff[2] >> dbuff[3] >> dbuff[4] >> dbuff[5]; + sendPacket << MsgType::FireTrace << dbuff[0] << dbuff[1] << dbuff[2] << dbuff[3] << dbuff[4] << dbuff[5]; + for (auto& player : _players) { + if(player.first != senderId) + _socket.send(sendPacket, player.first); + } + + break; + case MsgType::RemoveBonus: + packet >> tmp; + + if(tmp.find("Bonus_hill") != std::string::npos) { + _players[senderId]->setFullHealth(); + } + if(tmp.find("Bonus_ability") != std::string::npos) { + _players[senderId]->setFullAbility(); + } + + _bonuses[tmp].onTheMap = false; + _bonuses[tmp].lastTake = Time::time(); + sendPacket << MsgType::RemoveBonus << tmp; + for (auto& player : _players) { + if(player.first != senderId) + _socket.send(sendPacket, player.first); + } + break; + } +} + +void Server::processStop() { + for (auto it = _players.begin(); it != _players.end();) + _players.erase(it++); +} + +void Server::generateBonuses() { + _bonuses.insert({"Bonus_gun_1", {Point4D(-10, -2, -15), -2*_bonusRechargeTime, true}}); + _bonuses.insert({"Bonus_gun_2", {Point4D(10, -2, 15), -2*_bonusRechargeTime, true}}); + + _bonuses.insert({"Bonus_shotgun_1", {Point4D(-10, 13, -24), -2*_bonusRechargeTime, true}}); + _bonuses.insert({"Bonus_shotgun_2", {Point4D(10, 13, 24), -2*_bonusRechargeTime, true}}); + + _bonuses.insert({"Bonus_ak47_1", {Point4D(-25, 30, 50), -2*_bonusRechargeTime, true}}); + _bonuses.insert({"Bonus_ak47_2", {Point4D(25, 30, -50), -2*_bonusRechargeTime, true}}); + + _bonuses.insert({"Bonus_gold_ak47_1", {Point4D(-35, 80, 25), -2*_bonusRechargeTime, true}}); + _bonuses.insert({"Bonus_gold_ak47_2", {Point4D(35, 80, -25), -2*_bonusRechargeTime, true}}); + + _bonuses.insert({"Bonus_rifle_1", {Point4D(40, -2, 45), -2*_bonusRechargeTime, true}}); + _bonuses.insert({"Bonus_rifle_2", {Point4D(-40, -2, -45), -2*_bonusRechargeTime, true}}); + + _bonuses.insert({"Bonus_hill_1", {Point4D(-40, -2, 45), -2*_bonusRechargeTime, true}}); + _bonuses.insert({"Bonus_hill_2", {Point4D(40, -2, -45), -2*_bonusRechargeTime, true}}); + + _bonuses.insert({"Bonus_ability_1", {Point4D(25, 18, -33), -2*_bonusRechargeTime, true}}); + _bonuses.insert({"Bonus_ability_2", {Point4D(-25, 18, 33), -2*_bonusRechargeTime, true}}); +} + +void Server::updateInfo() { + for(auto& bonus : _bonuses) { + if(!bonus.second.onTheMap && abs(Time::time() - bonus.second.lastTake) > _bonusRechargeTime) { + sf::Packet sendPacket; + sendPacket << MsgType::AddBonus << bonus.first << bonus.second.position.x() << bonus.second.position.y() << bonus.second.position.z(); + for (const auto& player : _players) + _socket.sendRely(sendPacket, player.first); + bonus.second.onTheMap = true; + } + } +} diff --git a/Server.h b/Server.h new file mode 100755 index 0000000..05f9d36 --- /dev/null +++ b/Server.h @@ -0,0 +1,43 @@ +// +// Created by Иван Ильин on 25.05.2021. +// + +#ifndef SHOOTER_SERVER_H +#define SHOOTER_SERVER_H + +#include "network/ServerUDP.h" +#include "Player.h" +#include "Bonus.h" + +struct BonusInfo { + Point4D position; + double lastTake; + bool onTheMap; +}; + +class Server : public ServerUDP { +private: + std::map> _players{}; + std::map _bonuses{}; + double _bonusRechargeTime = 60; + +public: + Server() = default; + + void broadcast() override; + + void processConnect(sf::Uint16 senderId) override; + void processClientUpdate(sf::Uint16 senderId, sf::Packet& packet) override; + void processDisconnect(sf::Uint16 senderId) override; + + void processCustomPacket(MsgType type, sf::Packet& packet, sf::Uint16 senderId) override; + + void processStop() override; + + void generateBonuses(); + + void updateInfo() override; +}; + + +#endif //MINECRAFT_3DZAVR_SERVER_H diff --git a/Shotgun.cpp b/Shotgun.cpp new file mode 100755 index 0000000..bcf4eca --- /dev/null +++ b/Shotgun.cpp @@ -0,0 +1,56 @@ +// +// Created by Иван Ильин on 02.06.2021. +// + +#include +#include "Shotgun.h" + +using namespace std; + +Shotgun::Shotgun(int ammo, const std::string& weaponName) : Weapon(weaponName, "../obj/shotgun.obj", "../obj/shotgun_mat.txt", Point4D{3, 3, 3}, Point4D{-0.95, 1.3, -0.6}, Point4D{0, M_PI, 0}) { + fireSound.setBuffer(*ResourceManager::loadSoundBuffer("../sound/weapons/shotgun.ogg")); + reloadSound.setBuffer(*ResourceManager::loadSoundBuffer("../sound/weapons/reload_shotgun.ogg")); + + //reloadSound.setVolume(30); + _initialPack = 15; + _clipCapacity = 1; // how much ammo can be stored in one clipx + _stockAmmo = ammo - _clipCapacity; // how much ammo do you have in stock + _clipAmmo = _clipCapacity; // how much ammo do you have in current clip + _reloadTime = 1; + _fireDelay = 1; // time delay between fires + _damage = 400; + _spreading = 5; +} + +std::map +Shotgun::processFire(const std::shared_ptr &world, const std::shared_ptr &camera) { + std::map damagedPlayers; + + for(int i = 0; i < 15; i++) { + //generate random vector + Point4D randV(10*_spreading*(1.0 - 2.0*(double)rand()/RAND_MAX), 10*_spreading*(1.0 - 2.0*(double)rand()/RAND_MAX), 10*_spreading*(1.0 - 2.0*(double)rand()/RAND_MAX)); + + // damage player + auto rayCast = world->rayCast(camera->position(), camera->position() + camera->lookAt() * 1000 + randV); + if (rayCast.second.find("Player") != std::string::npos) { + damagedPlayers[rayCast.second] += _damage / (1.0 + (camera->position() - rayCast.first).abs()); + } + + // add trace line + Point4D to = rayCast.first.w() == -1 ? camera->position() + camera->lookAt() * 1000 + randV: rayCast.first; + string traceName = _name + "_trace_nr_" + std::to_string(fireTraces++); + Point4D from = _objects[_name + "_" + to_string(9)]->position() + + _objects[_name + "_" + to_string(9)]->triangles()[0][0]; + world->addMesh(make_shared(Mesh::LineTo(from, to, 0.05)), traceName); + (*world)[traceName]->setCollider(false); + + // remove trace line after some time + (*world)[traceName]->a_color("color_trace", {255, 255, 255, 0}, 1, Animation::None, Animation::linear); + (*world)["map_0"]->a_function(traceName + "delete", [world, traceName]() { deleteTrace(world, traceName); }, + 1, 2); + addTraceCallBack(from, to); + } + + + return damagedPlayers; +} diff --git a/Shotgun.h b/Shotgun.h new file mode 100755 index 0000000..bef1fa8 --- /dev/null +++ b/Shotgun.h @@ -0,0 +1,17 @@ +// +// Created by Иван Ильин on 02.06.2021. +// + +#ifndef SHOOTER_SHOTGUN_H +#define SHOOTER_SHOTGUN_H + +#include "Weapon.h" + +class Shotgun : public Weapon { +public: + explicit Shotgun(int ammo = 15, const std::string& weaponName = "shotgun"); + std::map processFire(const std::shared_ptr& world, const std::shared_ptr& camera) override; +}; + + +#endif //SHOOTER_3DZAVR_SHOTGUN_H diff --git a/Weapon.cpp b/Weapon.cpp new file mode 100755 index 0000000..2565da5 --- /dev/null +++ b/Weapon.cpp @@ -0,0 +1,127 @@ +// +// Created by Иван Ильин on 01.06.2021. +// + +#include +#include "Weapon.h" +#include "ResourceManager.h" +#include "utils/Log.h" + +using namespace std; + +Weapon::Weapon(const std::string& weaponName, const std::string& objFileName, const std::string& matFileName, const Point4D& scale, const Point4D& translate, const Point4D& rotate) { + _name = weaponName; + auto objs = Mesh::LoadObjects(objFileName, matFileName, scale); + for(int i = 0; i < objs.size(); i++) { + string meshName = _name + "_" + to_string(i); + objs[i]->setCollider(false); + + //transforms + objs[i]->rotate(rotate); + objs[i]->translate(translate); + + _objects.insert({meshName, objs[i]}); + } + noAmmoSound.setBuffer(*ResourceManager::loadSoundBuffer("../sound/weapons/no_ammo.ogg")); +} + +std::map Weapon::fire(const std::shared_ptr& world, const std::shared_ptr& camera) { + if(_clipAmmo == 0) { + reload(); + if(_clipAmmo == 0) + noAmmoSound.play(); + } + + if(_clipAmmo <= 0 || abs(Time::time() - _lastFireTime) < _fireDelay || abs(Time::time() - _lastReloadTime) < _reloadTime) + return std::map(); + + _lastFireTime = Time::time(); + _clipAmmo--; + + fireSound.play(); + Log::log("Weapon::fire (" + std::to_string(_stockAmmo) + " : " + std::to_string(_clipAmmo) + ")"); + + return processFire(world, camera); +} + +void Weapon::reload() { + if (_stockAmmo == 0 || abs(Time::time() - _lastReloadTime) < _reloadTime) + return; + if(_clipCapacity - _clipAmmo <= _stockAmmo) { + _stockAmmo -= _clipCapacity - _clipAmmo; + _clipAmmo = _clipCapacity; + } else { + _clipAmmo += _stockAmmo; + _stockAmmo = 0; + } + + reloadSound.play(); + Log::log("Weapon::reload (" + std::to_string(_stockAmmo) + " : " + std::to_string(_clipAmmo) + ")"); + _lastReloadTime = Time::time(); +} + +void Weapon::addToWorld(const shared_ptr &world) { + for(auto& obj : _objects) { + world->addMesh(obj.second, obj.first); + } +} + +void Weapon::removeFromWorld(const shared_ptr &world) { + for(auto& obj : _objects) { + world->removeMeshInstantly(obj.first); + } +} + + +void Weapon::attachToPlayer(Mesh &player) { + for(auto& obj : _objects) { + player.attach(obj.second); + } +} + +void Weapon::rotate(const Point4D& point4D, double val) { + for(auto& mesh : _objects) + mesh.second->rotate(point4D, val); +} + +void Weapon::translate(const Point4D &point4D) { + for(auto& mesh : _objects) + mesh.second->translate(point4D); +} + +void Weapon::deleteTrace(const shared_ptr &world, const std::string& traceName) { + world->removeMesh(traceName); +} + +void Weapon::rotateRelativePoint(const Point4D &point4D, const Point4D &v, double val) { + for(auto& mesh : _objects) + mesh.second->rotateRelativePoint(point4D, v, val); +} + +std::map Weapon::processFire(const shared_ptr &world, const shared_ptr &camera) { + std::map damagedPlayers; + + //generate random vector + Point4D randV(10.0*_spreading*(1.0 - 2.0*(double)rand()/RAND_MAX), 10.0*_spreading*(1.0 - 2.0*(double)rand()/RAND_MAX), 10.0*_spreading*(1.0 - 2.0*(double)rand()/RAND_MAX)); + + // damage player + auto rayCast = world->rayCast(camera->position(), camera->position() + camera->lookAt() * 1000 + randV); + if(rayCast.second.find("Player") != std::string::npos) { + damagedPlayers[rayCast.second] += _damage/(1.0 + (camera->position() - rayCast.first).abs()); + } + + // add trace line + Point4D to = rayCast.first.w() == -1 ? camera->position() + camera->lookAt() * 1000 + randV: rayCast.first; + string traceName = _name + "_trace_nr_" + std::to_string(fireTraces++); + Point4D from = _objects[_name + "_" + to_string(_objects.size()-1)]->position() + _objects[_name + "_" + to_string(_objects.size()-1)]->triangles()[0][0]; + world->addMesh(make_shared(Mesh::LineTo(from, to, 0.05)), traceName); + (*world)[traceName]->setCollider(false); + + // remove trace line after some time + (*world)[traceName]->a_color("color_trace", {255, 255, 255, 0}, 1, Animation::None, Animation::linear); + (*world)["Player_im"]->a_function(traceName + "delete", [world, traceName](){deleteTrace(world, traceName); }, 1, 2); + + addTraceCallBack(from, to); + + return damagedPlayers; +} diff --git a/Weapon.h b/Weapon.h new file mode 100755 index 0000000..ff4db0c --- /dev/null +++ b/Weapon.h @@ -0,0 +1,80 @@ +// +// Created by Иван Ильин on 01.06.2021. +// + +#ifndef SHOOTER_WEAPON_H +#define SHOOTER_WEAPON_H + + +#include +#include +#include +#include +#include "Mesh.h" +#include "utils/Time.h" + +class Weapon { +protected: + int _initialPack = 100; // how much ammo do you have when you find the weapon + + int _clipCapacity = 30; // how much ammo can be stored in one clip + int _stockAmmo = _initialPack - _clipCapacity; // how much ammo do you have in stock + int _clipAmmo = _clipCapacity; // how much ammo do you have in current clip + + double _reloadTime = 3; + double _fireDelay = 0.1; // time delay between fires + double _damage = 300; + + double _spreading = 2.0; + + [[maybe_unused]] double _firePower = M_PI/100; + + std::string _name = "Weapon_name"; + std::map> _objects; + + double _lastFireTime = -INFINITY; + double _lastReloadTime = -INFINITY; + + sf::Sound fireSound; + sf::Sound reloadSound; + sf::Sound noAmmoSound; + + static void deleteTrace(const std::shared_ptr &world, const std::string& traceName); + + int fireTraces = 0; + + std::function addTraceCallBack; + +public: + Weapon(const std::string& weaponName, const std::string& objFileName, const std::string& matFileName, const Point4D& scale, const Point4D& translate, const Point4D& rotate); + + std::map fire(const std::shared_ptr& world, const std::shared_ptr& camera); + void reload(); + + void addToWorld(const std::shared_ptr& world); + void removeFromWorld(const std::shared_ptr& world); + + void attachToPlayer(Mesh& player); + + [[nodiscard]] std::pair balance() const{ return std::make_pair(_clipAmmo, _stockAmmo); } + + void rotateRelativePoint(const Point4D& point4D, const Point4D& v, double val); + + void rotate(const Point4D& point4D, double val); + void translate(const Point4D& point4D); + + void setAddTraceCallBack(std::function add) { + addTraceCallBack = std::move(add); + } + + [[nodiscard]] std::string name() const { return _name; } + + void addAmmo(int ammoAdd) { _stockAmmo += ammoAdd; } + + virtual std::map processFire(const std::shared_ptr& world, const std::shared_ptr& camera); + + [[nodiscard]] int initialPack() const {return _initialPack; } +}; + + +#endif //SHOOTER_3DZAVR_WEAPON_H diff --git a/engine/Camera.cpp b/engine/Camera.cpp new file mode 100755 index 0000000..61c14cc --- /dev/null +++ b/engine/Camera.cpp @@ -0,0 +1,256 @@ +// +// Created by Иван Ильин on 14.01.2021. +// + +#include "Camera.h" +#include "utils/Log.h" + +std::vector &Camera::project(Mesh& mesh, Screen::ViewMode mode) { + + if(!ready) { + Log::log("Camera::project(): cannot project tris without camera initialization ( Camera::init() ) "); + return this->triangles; + } + + if(!mesh.isVisible()) + return this->triangles; + + // Model transform matrix: translate tris in the origin of mesh. + Matrix4x4 M = Matrix4x4::Translation(mesh.position()); + VM = V * M; + + // We don't want to waste time re-allocating memory every time + std::vector clippedTriangles, tempBuffer; + for(auto& t : mesh.triangles()) { + + double dot = t.norm().dot((mesh.position() + t[0] - p_position).normalize()); + + if(dot > 0) + continue; + + Triangle clipped[2]; + // It needs to be cleared because it's reused through iterations. Usually it doesn't free memory. + clippedTriangles.clear(); + + // In the beginning we need to to translate triangle from world coordinate to our camera system: + // After that we apply clipping for all planes from clipPlanes + clippedTriangles.emplace_back(t * VM); + for(auto& plane : clipPlanes) + { + while(!clippedTriangles.empty()) + { + clipped[0] = clippedTriangles.back(); + clipped[1] = clipped[0]; + clippedTriangles.pop_back(); + int additional = plane.clip(clipped[0], clipped[1]); + + for(int i = 0; i < additional; i++) + tempBuffer.emplace_back(clipped[i]); + } + clippedTriangles.swap(tempBuffer); + } + + for(auto& clippedTriangle : clippedTriangles) { + if(mode != Screen::ViewMode::Clipped) { + clippedTriangle.color = sf::Color(clippedTriangle.color.r * (0.3 * std::abs(dot) + 0.7), + clippedTriangle.color.g * (0.3 * std::abs(dot) + 0.7), + clippedTriangle.color.b * (0.3 * std::abs(dot) + 0.7), + (mode == Screen::ViewMode::Transparency || + mode == Screen::ViewMode::Normals) ? 100 : clippedTriangle.color.a); + } + + // Finally its time to project our clipped colored triangle from 3D -> 2D + // and transform it's coordinate to screen space (in pixels): + clippedTriangle *= SP; + + clippedTriangle[0] /= clippedTriangle[0].w(); + clippedTriangle[1] /= clippedTriangle[1].w(); + clippedTriangle[2] /= clippedTriangle[2].w(); + + triangles.emplace_back(clippedTriangle); + } + } + + return this->triangles; +} + +void Camera::init(int width, int height, double fov, double ZNear, double ZFar) { + // We need to init camera only after creation or changing width, height, fov, ZNear or ZFar. + // Because here we calculate matrix that does not change during the motion of _objects or camera + w = width; h = height; + aspect = (double)width / (double)height; + P = Matrix4x4::Projection(fov, aspect, ZNear, ZFar); + S = Matrix4x4::ScreenSpace(width, height); + + SP = S * P; // screen-space-projections matrix + + // This is planes for clipping tris. + // Motivation: we are not interest in tris that we cannot see. + clipPlanes.emplace_back(Plane(Point4D{0, 0, 1}, Point4D{0, 0, ZNear})); // near plane + clipPlanes.emplace_back(Plane(Point4D{0, 0, -1}, Point4D{0, 0, ZFar})); // far plane + + double thetta1 = M_PI*fov*0.5/180.0; + double thetta2 = atan(aspect*tan(thetta1)); + clipPlanes.emplace_back(Plane(Point4D{-cos(thetta2), 0, sin(thetta2)}, Point4D{0, 0, 0})); // left plane + clipPlanes.emplace_back(Plane(Point4D{cos(thetta2), 0, sin(thetta2)}, Point4D{0, 0, 0})); // right plane + clipPlanes.emplace_back(Plane(Point4D{0, cos(thetta1), sin(thetta1)}, Point4D{0, 0, 0})); // down plane + clipPlanes.emplace_back(Plane(Point4D{0, -cos(thetta1), sin(thetta1)},Point4D{0, 0, 0})); // up plane + + ready = true; + Log::log("Camera::init(): camera successfully initialized."); +} + +std::vector &Camera::sorted() { + + // Sort tris from back to front + // This is some replacement for Z-buffer + std::sort(triangles.begin(), triangles.end(), [](Triangle &t1, Triangle &t2) + { + std::vector v_z1({t1[0].z(), t1[1].z(), t1[2].z()}); + std::vector v_z2({t2[0].z(), t2[1].z(), t2[2].z()}); + + std::sort(v_z1.begin(), v_z1.end()); + std::sort(v_z2.begin(), v_z2.end()); + + double a = 1; + double b = 1; + double c = 1; + + double z1 = (a*v_z1[0] + b*v_z1[1] + c*v_z1[2]); + double z2 = (a*v_z2[0] + b*v_z2[1] + c*v_z2[2]); + + return z1 > z2; + }); + + return triangles; +} + +void Camera::record() { + // Cleaning all tris and recalculation of View matrix + // That is like preparation for new camera shot: we need to set + // the position of camera and insert new cartridge for photo. + triangles.clear(); + V = Matrix4x4::View(p_left, p_up, p_lookAt, p_position); +} + +void Camera::rotateX(double rx) { + p_angle = Point4D{p_angle.x() + rx, p_angle.y(), p_angle.z()}; + p_left = Matrix4x4::RotationX(rx) * p_left; + p_up = Matrix4x4::RotationX(rx) * p_up; + p_lookAt = Matrix4x4::RotationX(rx) * p_lookAt; +} + +void Camera::rotateY(double ry) { + p_angle = Point4D{p_angle.x(), p_angle.y() + ry, p_angle.z()}; + p_left = Matrix4x4::RotationY(ry) * p_left; + p_up = Matrix4x4::RotationY(ry) * p_up; + p_lookAt = Matrix4x4::RotationY(ry) * p_lookAt; +} + +void Camera::rotateZ(double rz) { + p_angle = Point4D{p_angle.x(), p_angle.y(), p_angle.z() + rz}; + p_left = Matrix4x4::RotationZ(rz) * p_left; + p_up = Matrix4x4::RotationZ(rz) * p_up; + p_lookAt = Matrix4x4::RotationZ(rz) * p_lookAt; +} + +void Camera::rotate(double rx, double ry, double rz) { + rotateX(rx); + rotateY(ry); + rotateZ(rz); + + if(v_attached.empty()) + return; + for(auto& attached : v_attached) + attached->rotateRelativePoint(position(), Point4D{rx, ry, rz}); + +} + +void Camera::rotate(const Point4D& r) { + rotate(r.x(), r.y(), r.z()); +} + + +void Camera::rotate(const Point4D& v, double rv) { + p_left = Matrix4x4::Rotation(v, rv) * p_left; + p_up = Matrix4x4::Rotation(v, rv) * p_up; + p_lookAt = Matrix4x4::Rotation(v, rv) * p_lookAt; + + if(v_attached.empty()) + return; + for(auto& attached : v_attached) + attached->rotateRelativePoint(position(), v, rv); +} + +void Camera::rotateLeft(double rl) { + p_angleLeftUpLookAt = Point4D{p_angleLeftUpLookAt.x() + rl, p_angleLeftUpLookAt.y(), p_angleLeftUpLookAt.z()}; + + rotate(p_left, rl); + + if(v_attached.empty()) + return; + for(auto& attached : v_attached) + attached->rotateRelativePoint(position(), p_left, rl); +} + +void Camera::rotateUp(double ru) { + p_angleLeftUpLookAt = Point4D{p_angleLeftUpLookAt.x(), p_angleLeftUpLookAt.y() + ru, p_angleLeftUpLookAt.z()}; + rotate(p_up, ru); + + if(v_attached.empty()) + return; + for(auto& attached : v_attached) + attached->rotateRelativePoint(position(), p_up, ru); +} + +void Camera::rotateLookAt(double rlAt) { + p_angleLeftUpLookAt = Point4D{p_angleLeftUpLookAt.x(), p_angleLeftUpLookAt.y(), p_angleLeftUpLookAt.z() + rlAt}; + rotate(p_lookAt, rlAt); + + if(v_attached.empty()) + return; + for(auto& attached : v_attached) + attached->rotateRelativePoint(position(), p_lookAt, rlAt); +} + +void Camera::rotateRelativePoint(const Point4D &s, double rx, double ry, double rz) { + p_angle += Point4D{rx, ry, rz}; + + // Translate XYZ by vector r1 + Point4D r1 = p_position - s; + // In translated coordinate system we rotate camera and position + Point4D r2 = Matrix4x4::Rotation(rx, ry, rz)*r1; + rotate(rx, ry, rz); + + // After rotation we translate XYZ by vector -r2 and recalculate position + p_position = s + r2; + + if(v_attached.empty()) + return; + for(auto& attached : v_attached) + attached->rotateRelativePoint(s, Point4D{rx, ry, rz}); +} + +void Camera::rotateRelativePoint(const Point4D &s, const Point4D &r) { + rotateRelativePoint(s, r.x(), r.y(), r.z()); +} + +void Camera::rotateRelativePoint(const Point4D &s, const Point4D &v, double r) { + // Translate XYZ by vector r1 + Point4D r1 = p_position - s; + // In translated coordinate system we rotate camera and position + Point4D r2 = Matrix4x4::Rotation(v, r)*r1; + rotate(v, r); + + // After rotation we translate XYZ by vector -r2 and recalculate position + p_position = s + r2; + + if(v_attached.empty()) + return; + for(auto& attached : v_attached) + attached->rotateRelativePoint(s, v, r); +} + +void Camera::translateToPoint(const Point4D &point) { + translate(point - p_position); +} diff --git a/engine/Camera.h b/engine/Camera.h new file mode 100755 index 0000000..9894829 --- /dev/null +++ b/engine/Camera.h @@ -0,0 +1,98 @@ +// +// Created by Иван Ильин on 14.01.2021. +// + +#ifndef ENGINE_CAMERA_H +#define ENGINE_CAMERA_H + +#include +#include "Screen.h" +#include "Plane.h" +#include "Mesh.h" + +class Camera : public Object, public Animatable{ +private: + Point4D p_angleLeftUpLookAt; + + Point4D p_left = Point4D{1, 0, 0, 0}; // internal X + Point4D p_up = Point4D{0, 1, 0, 0}; // internal Y + Point4D p_lookAt = Point4D{0, 0, 1, 0}; // internal Z + + Matrix4x4 S; // screen space matrix + Matrix4x4 P; // projections matrix + Matrix4x4 V; // camera matrix + + double aspect = 0; + + // To accelerate calculations we can use precalculated matrix that does not chance + Matrix4x4 SP; // screen-space-projections matrix + Matrix4x4 VM; // camera-model-animation matrix + + std::vector triangles; + std::vector clipPlanes; + + bool ready = false; + + double w = 0; + double h = 0; +public: + Camera() = default; + Camera(const Camera& camera) = delete; + + + void init(int width, int height, double fov = 110.0, double ZNear = 0.1, double ZFar = 5000.0); + + std::vector& project(Mesh& mesh, Screen::ViewMode mode); + + void record(); + + [[nodiscard]] int buffSize() const { return triangles.size(); } + std::vector& sorted(); + + [[nodiscard]] Point4D position() const override { return p_position; } + [[nodiscard]] Point4D angle() const override { return p_angle; } + [[nodiscard]] Point4D angleLeftUpLookAt() const { return p_angleLeftUpLookAt; } + + [[nodiscard]] Point4D eye() const { return p_position; } + [[nodiscard]] Point4D left() const { return p_left; } + [[nodiscard]] Point4D right() const { return -p_left; } + [[nodiscard]] Point4D up() const { return p_up; } + [[nodiscard]] Point4D down() const { return -p_up; } + [[nodiscard]] Point4D lookAt() const { return p_lookAt; } + + void translate(const Point4D& dv) override { + p_position += dv; + + if(v_attached.empty()) + return; + for(const auto& attached : v_attached) + attached->translate(dv); + } + void translate(double dx, double dy, double dz) { + translate(Point4D{dx, dy, dz}); + } + + void translateToPoint(const Point4D& point); + + void rotateX(double rx); + void rotateY(double ry); + void rotateZ(double rz); + void rotate(double rx, double ry, double rz); + void rotate(const Point4D& r) override; + + void rotate(const Point4D& v, double rv) override; + + void rotateLeft(double rl); + void rotateUp(double ru); + void rotateLookAt(double rlAt); + + // Rotate mesh around XYZ by (rx, ry, rz) radians relative val 'point4D' + void rotateRelativePoint(const Point4D& s, double rl, double ru, double rlAt); + // Rotate mesh around XYZ by (r.x, r.y, r.z) radians relative val 'point4D' + void rotateRelativePoint(const Point4D& s, const Point4D& r) override; + // Rotate mesh around normalised vector 'v' by 'r' radians relative val 'point4D' + void rotateRelativePoint(const Point4D& s, const Point4D& v, double r) override; +}; + + +#endif //INC_3DZAVR_CAMERA_H diff --git a/engine/CameraController.cpp b/engine/CameraController.cpp new file mode 100755 index 0000000..f1a87ec --- /dev/null +++ b/engine/CameraController.cpp @@ -0,0 +1,38 @@ +// +// Created by Иван Ильин on 23.01.2021. +// + +#include "CameraController.h" + +#include + +CameraController::CameraController(std::shared_ptr camera, std::shared_ptr screen) : camera(std::move(camera)), screen(std::move(screen)) { +} + +void CameraController::update() { + // Left and right + if (Screen::isKeyPressed(sf::Keyboard::A)) + camera->translate(camera->left()*Time::deltaTime()*5.0); + + if (Screen::isKeyPressed(sf::Keyboard::D)) + camera->translate(-camera->left()*Time::deltaTime()*5.0); + + // Forward and backward + if (Screen::isKeyPressed(sf::Keyboard::W)) + camera->translate(camera->lookAt()*Time::deltaTime()*5.0); + + if (Screen::isKeyPressed(sf::Keyboard::S)) + camera->translate(-camera->lookAt()*Time::deltaTime()*5.0); + + if (Screen::isKeyPressed(sf::Keyboard::LShift)) + camera->translate(0.0, -Time::deltaTime()*5.0, 0); + + if (Screen::isKeyPressed(sf::Keyboard::Space)) + camera->translate(0.0, Time::deltaTime()*5.0, 0); + + // Mouse movement + Point4D disp = screen->getMouseDisplacement(); + + camera->rotateY(-disp.x()/1000.0); + camera->rotateLeft(disp.y()/1000.0); +} diff --git a/engine/CameraController.h b/engine/CameraController.h new file mode 100755 index 0000000..9fa9ce2 --- /dev/null +++ b/engine/CameraController.h @@ -0,0 +1,21 @@ +// +// Created by Иван Ильин on 23.01.2021. +// + +#ifndef ENGINE_CAMERACONTROLLER_H +#define ENGINE_CAMERACONTROLLER_H + +#include "Camera.h" +#include "Screen.h" + +class CameraController { +private: + std::shared_ptr camera; + std::shared_ptr screen; +public: + CameraController(std::shared_ptr camera, std::shared_ptr screen); + void update(); +}; + + +#endif //INC_3DZAVR_CAMERACONTROLLER_H diff --git a/engine/Engine.cpp b/engine/Engine.cpp new file mode 100755 index 0000000..3c30a3a --- /dev/null +++ b/engine/Engine.cpp @@ -0,0 +1,105 @@ +// +// Created by Иван Ильин on 14.01.2021. +// + +#include "Engine.h" +#include "utils/Time.h" +#include +#include "ResourceManager.h" +#include "physics/Solver.h" + +Engine::Engine() { + screen = std::make_shared(); + world = std::make_shared(); + camera = std::make_shared(); +} + +void Engine::create(int screenWidth, int screenHeight, const std::string &name, bool verticalSync, sf::Color background, sf::Uint32 style) { + screen->open(screenWidth, screenHeight, name, verticalSync, background, style); + + Log::log("Engine::create(): started engine (" + std::to_string(screenWidth) + " x " + std::to_string(screenHeight) + ") with name '" + name + "'."); + Time::update(); + + start(); + camera->init(screenWidth, screenHeight); + screen->getMouseDisplacement(); // We do it to set mouse position in the center (see how getMouseDisplacement() works) + + while (screen->isOpen()) { + screen->clear(); + + Time::update(); + screen->keyboardControl(); + update(Time::deltaTime()); + + world->garbageCollector(); + /* Project all mesh + * Here we project all tris for each mesh from world._objects. + * When we call camera.project(m.second), + */ + + // sometimes we dont need to update physics world + // (for example in menu or while pause) + // hence we can set 'b_updateWorld' equal to false in setUpdateWorld(bool): + if(b_updateWorld) { + camera->record(); + for (auto &m : world->objects()) { + m.second->a_update(); + camera->project(*m.second, screen->mode()); + + m.second->updatePhysicsState(); + // isCollision detection: + if (m.second->isCollision()) { + m.second->setInCollision(false); + m.second->setCollisionNormal(Point4D{0, 0, 0}); + for (auto &obj : world->objects()) { + if(obj.first != m.first) { + std::pair gjk = m.second->checkGJKCollision(obj.second); + if (gjk.first) { + if (obj.second->isCollider()) { + CollisionPoint epa = m.second->EPA(gjk.second, obj.second); + Solver::solveCollision(m.second, obj.second, epa); + } + if (m.second->collisionCallBack() != nullptr) + m.second->collisionCallBack()(obj.first, obj.second); + } + } + } + } + + } + + // draw projected mesh + for (auto &t : camera->sorted()) + screen->triangle(t); + + camera->a_update(); + + triPerSec = camera->buffSize() * Time::fps(); + + if (b_debugText) { + screen->debugText(name + "\n\n X: " + + std::to_string((camera->eye().x())) + "\n Y: " + + std::to_string((camera->eye().y())) + "\n Z: " + + std::to_string((camera->eye().z())) + "\n\n" + + std::to_string(screen->width()) + "x" + + std::to_string(screen->height()) + "\n" + + std::to_string(Time::fps()) + + " fps \n" + std::to_string((int) triPerSec) + " tris/s"); + } + } + + gui(); + screen->display(); + } + exit(); +} + +void Engine::exit() { + if(screen->isOpen()) { + screen->close(); + if(screen->isRender()) + screen->setRender(false); + } + ResourceManager::unloadAllResources(); + Log::log("Engine::exit(): exit engine (" + std::to_string(screen->width()) + " x " + std::to_string(screen->height()) + ") with name '" + screen->title() + "'."); +} diff --git a/engine/Engine.h b/engine/Engine.h new file mode 100755 index 0000000..f7dc2d2 --- /dev/null +++ b/engine/Engine.h @@ -0,0 +1,41 @@ +// +// Created by Иван Ильин on 14.01.2021. +// + +#ifndef ENGINE_ENGINE_H +#define ENGINE_ENGINE_H + +#include "Screen.h" +#include "World.h" +#include "Camera.h" +#include "utils/Log.h" +#include "CameraController.h" + +class Engine { +protected: + std::shared_ptr screen; + std::shared_ptr world; + std::shared_ptr camera; + + double triPerSec = 0; + + bool b_debugText = true; + bool b_updateWorld = true; +public: + Engine(); + + virtual ~Engine() = default; + + void create(int screenWidth = 1920, int screenHeight = 1080, const std::string& name = "engine", bool verticalSync = true, sf::Color background = sf::Color(255, 255, 255), sf::Uint32 style = sf::Style::Default); + + virtual void start() {}; + virtual void update(double elapsedTime) {}; + void exit(); + void debugText(bool value) { b_debugText = value; } + void setUpdateWorld(bool value) { b_updateWorld = value; } + + virtual void gui(){} +}; + + +#endif //INC_3DZAVR_TDZAVR_H diff --git a/engine/Mesh.cpp b/engine/Mesh.cpp new file mode 100755 index 0000000..e5f333c --- /dev/null +++ b/engine/Mesh.cpp @@ -0,0 +1,308 @@ +// +// Created by Иван Ильин on 13.01.2021. +// + +#include +#include +#include +#include +#include "Mesh.h" +#include "utils/Log.h" + +using namespace std; + +Mesh Mesh::operator*(const Matrix4x4 &matrix4X4) const { + return Mesh(*this) *= matrix4X4; +} + +Mesh &Mesh::operator*=(const Matrix4x4 &matrix4X4) { + for (auto& t : tris) + t *= matrix4X4; + + return *this; +} + +Mesh &Mesh::loadObj(const std::string& filename, const std::string &materials, const Point4D& scale) { + + auto objects = Mesh::LoadObjects(filename, materials, scale); + for(auto& obj : objects) { + for (auto &tri : obj->triangles()) { + tris.push_back(tri); + } + } + return *this; +} + +Mesh::Mesh(const std::string& filename, const std::string &materials, const Point4D& scale){ + loadObj(filename, materials, scale); +} + +Mesh::Mesh(const vector &tries){ + tris = tries; +} + +Mesh::Mesh(const Mesh& mesh) : Animatable(mesh) { + *this = mesh; +} + +Mesh Mesh::Obj(const std::string& filename) { + return Mesh(filename); +} + +Mesh Mesh::Cube(double size) { + Mesh cube{}; + cube.tris = { + { Point4D{0.0, 0.0, 0.0, 1.0}, Point4D{0.0, 1.0, 0.0, 1.0}, Point4D{1.0, 1.0, 0.0, 1.0} }, + { Point4D{0.0, 0.0, 0.0, 1.0}, Point4D{1.0, 1.0, 0.0, 1.0}, Point4D{1.0, 0.0, 0.0, 1.0} }, + { Point4D{1.0, 0.0, 0.0, 1.0}, Point4D{1.0, 1.0, 0.0, 1.0}, Point4D{1.0, 1.0, 1.0, 1.0} }, + { Point4D{1.0, 0.0, 0.0, 1.0}, Point4D{1.0, 1.0, 1.0, 1.0}, Point4D{1.0, 0.0, 1.0, 1.0} }, + { Point4D{1.0, 0.0, 1.0, 1.0}, Point4D{1.0, 1.0, 1.0, 1.0}, Point4D{0.0, 1.0, 1.0, 1.0} }, + { Point4D{1.0, 0.0, 1.0, 1.0}, Point4D{0.0, 1.0, 1.0, 1.0}, Point4D{0.0, 0.0, 1.0, 1.0} }, + { Point4D{0.0, 0.0, 1.0, 1.0}, Point4D{0.0, 1.0, 1.0, 1.0}, Point4D{0.0, 1.0, 0.0, 1.0} }, + { Point4D{0.0, 0.0, 1.0, 1.0}, Point4D{0.0, 1.0, 0.0, 1.0}, Point4D{0.0, 0.0, 0.0, 1.0} }, + { Point4D{0.0, 1.0, 0.0, 1.0}, Point4D{0.0, 1.0, 1.0, 1.0}, Point4D{1.0, 1.0, 1.0, 1.0} }, + { Point4D{0.0, 1.0, 0.0, 1.0}, Point4D{1.0, 1.0, 1.0, 1.0}, Point4D{1.0, 1.0, 0.0, 1.0} }, + { Point4D{1.0, 0.0, 1.0, 1.0}, Point4D{0.0, 0.0, 1.0, 1.0}, Point4D{0.0, 0.0, 0.0, 1.0} }, + { Point4D{1.0, 0.0, 1.0, 1.0}, Point4D{0.0, 0.0, 0.0, 1.0}, Point4D{1.0, 0.0, 0.0, 1.0} }, + + }; + + return cube *= Matrix4x4::Scale(size, size, size); +} + +void Mesh::translate(double dx, double dy, double dz) { + p_position += Point4D(dx, dy, dz); + + if(v_attached.empty()) + return; + for(auto attached : v_attached) + attached->translate(Point4D{dx, dy, dz}); +} + +void Mesh::rotate(double rx, double ry, double rz) { + p_angle += Point4D{rx, ry, rz}; + *this *= Matrix4x4::Rotation(rx, ry, rz); +} + +void Mesh::rotate(const Point4D &r) { + p_angle += r; + *this *= Matrix4x4::Rotation(r); + + if(v_attached.empty()) + return; + for(auto attached : v_attached) + attached->rotateRelativePoint(position(), r); +} + +void Mesh::rotate(const Point4D &v, double r) { + *this *= Matrix4x4::Rotation(v, r); + + if(v_attached.empty()) + return; + for(auto attached : v_attached) + attached->rotateRelativePoint(position(), v, r); +} + +void Mesh::scale(double sx, double sy, double sz) { + *this *= Matrix4x4::Scale(sx, sy, sz); +} + +void Mesh::scale(const Point4D &s) { + *this *= Matrix4x4::Scale(s.x(), s.y(), s.z()); +} + +void Mesh::translate(const Point4D &t) { + translate(t.x(), t.y(), t.z()); +} + +Mesh &Mesh::operator=(const Mesh &mesh) { + tris = mesh.tris; + p_position = mesh.p_position; + c_color = mesh.c_color; + return *this; +} + +void Mesh::rotateRelativePoint(const Point4D &s, double rx, double ry, double rz) { + p_angle += Point4D{rx, ry, rz}; + + // Translate XYZ by vector r1 + Point4D r1 = p_position - s; + *this *= Matrix4x4::Translation(r1); + + // In translated coordinate system we rotate mesh and position + Matrix4x4 rotationMatrix = Matrix4x4::Rotation(rx, ry, rz); + Point4D r2 = rotationMatrix*r1; + *this *= rotationMatrix; + + // After rotation we translate XYZ by vector -r2 and recalculate position + *this *= Matrix4x4::Translation(-r2); + p_position = s + r2; + + if(v_attached.empty()) + return; + for(auto attached : v_attached) + attached->rotateRelativePoint(s, Point4D{rx, ry, rz}); +} + +void Mesh::rotateRelativePoint(const Point4D &s, const Point4D &r) { + p_angle += r; + rotateRelativePoint(s, r.x(), r.y(), r.z()); +} + +void Mesh::rotateRelativePoint(const Point4D &s, const Point4D &v, double r) { + // Translate XYZ by vector r1 + Point4D r1 = p_position - s; + *this *= Matrix4x4::Translation(r1); + + // In translated coordinate system we rotate mesh and position + Matrix4x4 rotationMatrix = Matrix4x4::Rotation(v, r); + Point4D r2 = rotationMatrix*r1; + *this *= rotationMatrix; + + // After rotation we translate XYZ by vector -r2 and recalculate position + *this *= Matrix4x4::Translation(-r2); + p_position = s + r2; + + if(v_attached.empty()) + return; + for(auto attached : v_attached) + attached->rotateRelativePoint(s, v, r); +} + + +void Mesh::translateToPoint(const Point4D &point) { + translate(point - p_position); +} + +void Mesh::setColor(sf::Color c) { + c_color = c; + for (auto& t : tris) + t.color = c_color; +} + +std::vector> +Mesh::LoadObjects(const string &filename, const string &materials, const Point4D &scale) { + std::vector> objects; + map maters; + + ifstream file(filename); + if (!file.is_open()) + { + Log::log("Mesh::LoadObjects(): cannot load file from " + filename); + return objects; + } + + if(!materials.empty()) { + ifstream mat(materials); + + if (!mat.is_open()) + { + Log::log("Mesh::LoadObjects(): cannot load mat from " + materials); + return objects; + } else { + while (!mat.eof()) + { + char line[128]; + mat.getline(line, 128); + + stringstream s; + s << line; + + int color[4]; + string matName; + + s >> matName >> color[0] >> color[1] >> color[2] >> color[3]; + maters.insert({matName, sf::Color(color[0],color[1],color[2], color[3])}); + } + mat.close(); + } + } + + vector verts; + std::vector tris; + sf::Color currentColor = sf::Color(255, 245, 194, 255); + + while (!file.eof()) + { + char line[128]; + file.getline(line, 128); + + stringstream s; + s << line; + + char junk; + if(line[0] == 'o') { + if(!tris.empty()) { + objects.push_back(make_shared(tris)); + objects.back()->scale(scale); + } + tris.clear(); + } + if (line[0] == 'v') + { + double x, y, z; + s >> junk >> x >> y >> z; + verts.emplace_back(x, y, z, 1); + } + if(line[0] == 'g') { + string matInfo; + s >> junk >> matInfo; + string colorName = matInfo.substr(matInfo.size()-3, 3); + currentColor = maters[matInfo.substr(matInfo.size()-3, 3)]; + } + if (line[0] == 'f') + { + int f[3]; + s >> junk >> f[0] >> f[1] >> f[2]; + tris.emplace_back(verts[f[0] - 1], verts[f[1] - 1], verts[f[2] - 1] ); + tris.back().color = currentColor; + } + } + + if(!tris.empty()) { + objects.push_back(make_shared(tris)); + objects.back()->scale(scale); + } + + file.close(); + + return objects; +} + +Mesh Mesh::LineTo(const Point4D& from, const Point4D& to, double line_width, sf::Color color) { + Mesh line; + + Point4D v1 = (to - from).normalized(); + Point4D v2 = from.cross3D(from + Point4D{1, 0, 0}).normalized(); + Point4D v3 = v1.cross3D(v2).normalized(); + + // from plane + Point4D p1 = from - v2 * line_width/2.0 - v3 * line_width/2.0; + Point4D p2 = from - v2 * line_width/2.0 + v3 * line_width/2.0; + Point4D p3 = from + v2 * line_width/2.0 + v3 * line_width/2.0; + Point4D p4 = from + v2 * line_width/2.0 - v3 * line_width/2.0; + // to plane + Point4D p5 = to - v2 * line_width/2.0 - v3 * line_width/2.0; + Point4D p6 = to - v2 * line_width/2.0 + v3 * line_width/2.0; + Point4D p7 = to + v2 * line_width/2.0 + v3 * line_width/2.0; + Point4D p8 = to + v2 * line_width/2.0 - v3 * line_width/2.0; + + line.tris = { + { p2, p4, p1 }, + { p2, p3, p4 }, + { p1, p6, p2 }, + { p1, p5, p6 }, + { p2, p6, p7 }, + { p2, p7, p3 }, + { p6, p5, p8 }, + { p6, p8, p7 }, + { p4, p3, p7 }, + { p4, p7, p8 }, + { p1, p8, p5 }, + { p1, p4, p8 } + }; + + line.setColor(color); + + return line; +} diff --git a/engine/Mesh.h b/engine/Mesh.h new file mode 100755 index 0000000..9225f32 --- /dev/null +++ b/engine/Mesh.h @@ -0,0 +1,84 @@ +// +// Created by Иван Ильин on 13.01.2021. +// + +#ifndef ENGINE_MESH_H +#define ENGINE_MESH_H + +#include +#include "Triangle.h" +#include "animation/Animatable.h" +#include "physics/RigidBody.h" +#include +#include "Object.h" + +class Mesh : public Object, public Animatable, public RigidBody { +protected: + std::vector tris; + + bool _visible = true; + + sf::Color c_color = sf::Color(255, 245, 194); + + // Operations with Matrix4x4 + [[nodiscard]] Mesh operator*(const Matrix4x4& matrix4X4) const; + Mesh& operator*=(const Matrix4x4& matrix4X4); + + std::function&)> _collisionCallBack; + +public: + Mesh() = default; + Mesh(const Mesh& mesh); + + explicit Mesh(const std::vector& tries); + Mesh& operator=(const Mesh& mesh); + explicit Mesh(const std::string& filename, const std::string &materials = "", const Point4D& scale = Point4D{1, 1, 1}); + + Mesh& loadObj(const std::string& filename, const std::string &materials = "", const Point4D& scale = Point4D{1, 1, 1}); + + [[nodiscard]] std::vectorconst &triangles() const { return tris; } + [[nodiscard]] std::vector& triangles() override { return tris; } + void setTriangles(const std::vector& t) override { tris = t; } + + // Translate mesh + void translate(double dx, double dy, double dz); + void translate(const Point4D& t) override; + void translateToPoint(const Point4D& point); + // Rotate mesh around XYZ axes + void rotate(double rx, double ry, double rz); + void rotate(const Point4D& r) override; + // Rotate mesh around normalised vector 'v' by 'r' radians + void rotate(const Point4D& v, double r) override; + // Rotate mesh around XYZ by (rx, ry, rz) radians relative val 'point4D' + void rotateRelativePoint(const Point4D& point4D, double rx, double ry, double rz); + // Rotate mesh around XYZ by (r.x, r.y, r.z) radians relative val 'point4D' + void rotateRelativePoint(const Point4D& point4D, const Point4D& r) override; + // Rotate mesh around normalised vector 'v' by 'r' radians relative val 'point4D' + void rotateRelativePoint(const Point4D& point4D, const Point4D& v, double r) override; + void scale(double sx, double sy, double sz); + void scale(const Point4D& s); + + void rotateToAngle(const Point4D& v) { rotate(v - p_angle); } + + [[nodiscard]] Point4D position() const override { return p_position; } + [[nodiscard]] Point4D angle() const override { return p_angle; } + + [[nodiscard]] sf::Color color() const override { return c_color; } + void setColor(sf::Color c) override; + + Mesh static Cube(double size = 1.0); + Mesh static Obj(const std::string& filename); + Mesh static LineTo(const Point4D& from, const Point4D& to, double line_width = 0.1, sf::Color color = {150, 150, 150, 255}); + + + void setVisible(bool visibility) { _visible = visibility; } + [[nodiscard]] bool isVisible() const { return _visible; } + + std::vector> static LoadObjects(const std::string& filename, const std::string &materials = "", const Point4D& scale = Point4D{1, 1, 1}); + + [[nodiscard]] const std::function&)>& collisionCallBack() const { return _collisionCallBack; } + void setCollisionCallBack(const std::function&)>& f) { _collisionCallBack = f; } +}; + + +#endif //INC_3DZAVR_MESH_H diff --git a/engine/Object.h b/engine/Object.h new file mode 100755 index 0000000..1efbe0c --- /dev/null +++ b/engine/Object.h @@ -0,0 +1,36 @@ +// +// Created by Иван Ильин on 15.03.2021. +// + +#ifndef ENGINE_OBJECT_H +#define ENGINE_OBJECT_H + +#include +#include "utils/Point4D.h" +#include + +class Object { +protected: + std::vector> v_attached; + + Point4D p_position; + Point4D p_angle; +public: + Object() = default; + + virtual void translate(const Point4D& dv) {} + virtual void rotate(const Point4D& r) {} + virtual void rotateRelativePoint(const Point4D& point4D, const Point4D& r) {} + virtual void rotate(const Point4D& v, double rv) {} + virtual void rotateRelativePoint(const Point4D& s, const Point4D& v, double r) {} + + [[nodiscard]] Point4D position() const { return p_position; } + [[nodiscard]] Point4D angle() const { return p_angle; } + + void attach(const std::shared_ptr& object) { + v_attached.push_back(object); + } +}; + + +#endif //MINECRAFT_3DZAVR_OBJECT_H diff --git a/engine/Plane.cpp b/engine/Plane.cpp new file mode 100755 index 0000000..d262be7 --- /dev/null +++ b/engine/Plane.cpp @@ -0,0 +1,111 @@ +// +// Created by Иван Ильин on 19.01.2021. +// + +#include "Plane.h" + +Plane::Plane(const Triangle& tri) { + triangle = tri; + n = tri.norm(); + p = tri[0]; +} + +Plane::Plane(const Point4D &N, const Point4D &P) { + n = N; + p = P; +} + +Plane::Plane(const Plane &plane) { + triangle = plane.triangle; + n = plane.n; + p = plane.p; +} + +double Plane::distance(const Point4D &point4D) const { + return point4D.dot(n) - p.dot(n); +} + +std::pair Plane::intersection(const Point4D &start, const Point4D &end) { + double s_dot_n = start.dot(n); + double k = (s_dot_n - p.dot(n))/(s_dot_n - end.dot(n)); + Point4D res = start + (end - start)*k; + return std::make_pair(res, k); +} + +int Plane::clip(Triangle &tri, Triangle &additional_tri) { + n.normalize(); + + Point4D insidePoints[3]; int inside = 0; + Point4D outsidePoints[3]; int outside = 0; + + Point4D insideTextures[3]; int insideT = 0; + Point4D outsideTextures[3]; int outsideT = 0; + + double distances[3] = {distance(tri[0]), distance(tri[1]), distance(tri[2])}; + + for(int i = 0; i < 3; i++) { + if (distances[i] >= 0) { + insidePoints[inside++] = tri[i]; + insideTextures[insideT++] = tri.t[i]; + } else { + outsidePoints[outside++] = tri[i]; + outsideTextures[outsideT++] = tri.t[i]; + } + } + + if(inside == 0) { + tri.clip = Triangle::Skipped; + return 0; + } + + if(inside == 1) { + std::pair intersect1 = intersection(insidePoints[0], outsidePoints[0]); + std::pair intersect2 = intersection(insidePoints[0], outsidePoints[1]); + tri[0] = insidePoints[0]; + tri.t[0] = insideTextures[0]; + + tri[1] = intersect1.first; + tri.t[1] = insideTextures[0] + (outsideTextures[0] - insideTextures[0]) * intersect1.second; + + tri[2] = intersect2.first; + tri.t[2] = insideTextures[0] + (outsideTextures[1] - insideTextures[0]) * intersect2.second; + + tri.clip = Triangle::Cropped; + + return 1; + } + + if(inside == 2) { + std::pair intersect1 = intersection(insidePoints[0], outsidePoints[0]); + std::pair intersect2 = intersection(insidePoints[1], outsidePoints[0]); + + tri[0] = insidePoints[0]; + tri.t[0] = insideTextures[0]; + + tri[1] = intersect1.first; + tri.t[1] = insideTextures[0] + (outsideTextures[0] - insideTextures[0])*intersect1.second; + + tri[2] = insidePoints[1]; + tri.t[2] = insideTextures[1]; + + additional_tri[0] = intersect1.first; + additional_tri.t[0] = insideTextures[0] + (outsideTextures[0] - insideTextures[0])*intersect1.second; + + additional_tri[1] = intersect2.first; + additional_tri.t[1] = insideTextures[1] + (outsideTextures[0] - insideTextures[1])*intersect2.second; + + additional_tri[2] = insidePoints[1]; + additional_tri.t[2] = insideTextures[1]; + + tri.clip = Triangle::Doubled; + additional_tri.clip = Triangle::Doubled; + + return 2; + } + + if(inside == 3) { + return 1; + } + + return 0; +} diff --git a/engine/Plane.h b/engine/Plane.h new file mode 100755 index 0000000..f2fe955 --- /dev/null +++ b/engine/Plane.h @@ -0,0 +1,35 @@ +// +// Created by Иван Ильин on 19.01.2021. +// + +#ifndef ENGINE_PLANE_H +#define ENGINE_PLANE_H + +#include "utils/Point4D.h" +#include "Triangle.h" + +class Plane { +private: + // You can define plane by defining the points in 3D space + Triangle triangle; + // Or by defining normal vector and one val laying on the plane + Point4D n = Point4D{0, 0, 1, 0}; + Point4D p{}; +public: + // A plain with normal vector 'n' and val 'p' lays on the plane + Plane() = default; + Plane(const Point4D& N, const Point4D& P); + Plane(const Plane& plane); + explicit Plane(const Triangle& tri); + + [[nodiscard]] double distance(const Point4D& point4D) const; + // Point4D in space where line ('start' to 'end') intersects plain with normal vector 'n' and val 'p' lays on the plane + std::pair intersection(const Point4D& start, const Point4D& end); + int clip(Triangle& tri, Triangle& additional_tri); + + [[nodiscard]] Point4D N() const { return n; } + [[nodiscard]] Point4D P() const { return p; } +}; + + +#endif //INC_3DZAVR_PLANE_H diff --git a/engine/ResourceManager.cpp b/engine/ResourceManager.cpp new file mode 100755 index 0000000..3eb15e2 --- /dev/null +++ b/engine/ResourceManager.cpp @@ -0,0 +1,123 @@ +// +// Created by Neirokan on 09.05.2020 +// + +#include "ResourceManager.h" +#include +#include +#include +namespace ResourceManager +{ + namespace + { + std::map> _textures; + std::map> _fonts; + std::map> _soundBuffers; + std::map> _shaders; + } + + void unloadTextures() + { + for (auto & _texture : _textures) + _texture.second.reset(); + _textures.clear(); + } + + void unloadSoundBuffers() + { + for (auto & _soundBuffer : _soundBuffers) + _soundBuffer.second.reset(); + _soundBuffers.clear(); + } + + void unloadFonts() { + for (auto & _font : _fonts) + _font.second.reset(); + _fonts.clear(); + } + + void unloadShaders() { + for (auto& shader : _shaders) + shader.second.reset(); + _shaders.clear(); + } + + void unloadAllResources() + { + unloadTextures(); + unloadSoundBuffers(); + unloadFonts(); + unloadShaders(); + } + + std::shared_ptr loadTexture(const std::string& filename) + { + // If texture is already loaded - return pointer to it + auto it = _textures.find(filename); + if (it != _textures.end()) + return it->second; + + // Otherwise - try to load it. If failure - return zero + std::shared_ptr texture(new sf::Texture); + if (!texture->loadFromFile(filename)) + return nullptr; + + // If success - remember and return texture pointer + texture->setRepeated(true); + _textures.emplace(filename, texture); + + return texture; + } + + std::shared_ptr loadSoundBuffer(const std::string& filename) + { + // If sound buffer is already loaded - return pointer to it + auto it = _soundBuffers.find(filename); + if (it != _soundBuffers.end()) + return it->second; + + // Otherwise - try to load it. If failure - return zero + std::shared_ptr soundBuffer(new sf::SoundBuffer); + if (!soundBuffer->loadFromFile(filename)) + return nullptr; + + // If success - remember and return texture pointer + _soundBuffers.emplace(filename, soundBuffer); + + return soundBuffer; + } + + std::shared_ptr loadFont(const std::string& filename) { + // If font is already loaded - return pointer to it + auto it = _fonts.find(filename); + if (it != _fonts.end()) + return it->second; + + // Otherwise - try to load it. If failure - return zero + std::shared_ptr font(new sf::Font); + if (!font->loadFromFile(filename)) + return nullptr; + + // If success - remember and return texture pointer + _fonts.emplace(filename, font); + + return font; + } + + std::shared_ptr loadShader(const std::string& filename, sf::Shader::Type type) { + // If Shader is already loaded - return pointer to it + auto it = _shaders.find(filename); + if (it != _shaders.end()) + return it->second; + + // Otherwise - try to load it. If failure - return zero + std::shared_ptr shader(new sf::Shader); + if (!shader->loadFromFile(filename, type)) + return nullptr; + + // If success - remember and return texture pointer + _shaders.emplace(filename, shader); + + return shader; + } +} diff --git a/engine/ResourceManager.h b/engine/ResourceManager.h new file mode 100755 index 0000000..0d57216 --- /dev/null +++ b/engine/ResourceManager.h @@ -0,0 +1,32 @@ +// +// Created by Neirokan on 09.05.2020 +// + +#ifndef ENGINE_RESOURCEMANAGER_H +#define ENGINE_RESOURCEMANAGER_H + +#include +#include +#include + +namespace ResourceManager +{ + // Unloads all currently loaded textures. + void unloadTextures(); + void unloadSoundBuffers(); + void unloadFonts(); + void unloadShaders(); + + void unloadAllResources(); + + // Try to load texture from file. + // If success returns pointer to texture. + // Otherwise returns nullptr. + std::shared_ptr loadTexture(const std::string& filename); + std::shared_ptr loadFont(const std::string& filename); + std::shared_ptr loadSoundBuffer(const std::string& filename); + std::shared_ptr loadShader(const std::string& filename, sf::Shader::Type type); +}; + + +#endif //PSEUDO3DENGINE_RESOURCEMANAGER_H diff --git a/engine/Screen.cpp b/engine/Screen.cpp new file mode 100755 index 0000000..b8716af --- /dev/null +++ b/engine/Screen.cpp @@ -0,0 +1,205 @@ +// +// Created by Иван Ильин on 14.01.2021. +// + +#include "Screen.h" +#include "utils/Time.h" +#include +#include "utils/Log.h" +#include "ResourceManager.h" +#include + + +void Screen::open(int screenWidth, int screenHeight, const std::string &name, bool verticalSync, sf::Color background, sf::Uint32 style) { + this->name = name; + w = screenWidth; + h = screenHeight; + this->background = background; + + sf::ContextSettings settings; + settings.antialiasingLevel = 8; + + window.create(sf::VideoMode(w, h), name, style, settings); + window.setVerticalSyncEnabled(verticalSync); +} + +void Screen::display() { + sf::Event event{}; + while (window.pollEvent(event)) { + if (event.type == sf::Event::Closed) { + window.close(); + } + } + + std::string title = name + " (" + std::to_string(Time::fps()) + " fps)"; + window.setTitle(title); + + if(renderVideo || makeScreenShoot) + { + sf::Texture copyTexture; + copyTexture.create(window.getSize().x, window.getSize().y); + copyTexture.update(window); + if(makeScreenShoot) + copyTexture.copyToImage().saveToFile("../img/screen.png"); + else + copyTexture.copyToImage().saveToFile("../film/png/" + std::to_string(frame++) + ".png"); + makeScreenShoot = false; + } + + + window.display(); +} + +void Screen::clear() { + window.clear(background); +} + +void Screen::line(const Point4D& p1, const Point4D& p2, sf::Color color) +{ + if (!window.isOpen()) + return; + + sf::Vertex line[] = + { + sf::Vertex(sf::Vector2f(p1.x(), p1.y()), color), + sf::Vertex(sf::Vector2f(p2.x(), p2.y()), color) + }; + window.draw(line, 2, sf::Lines); +} + +void Screen::triangle(const Triangle& triangle) +{ + if(vm == Frame || vm == Borders || vm == Xray || vm == Clipped || vm == Transparency || vm == Normals) { + sf::Vertex lines[4] = + { + sf::Vertex(sf::Vector2f(triangle[0].x(), triangle[0].y()), sf::Color(0, 0, 0, 255)), + sf::Vertex(sf::Vector2f(triangle[1].x(), triangle[1].y()), sf::Color(0, 0, 0, 255)), + sf::Vertex(sf::Vector2f(triangle[2].x(), triangle[2].y()), sf::Color(0, 0, 0, 255)), + sf::Vertex(sf::Vector2f(triangle[0].x(), triangle[0].y()), sf::Color(0, 0, 0, 255)) + }; + + window.draw(lines, 4, sf::LineStrip); + } + if(vm == Frame || vm == Xray) + return; // no texture when we turn on Frame or Xray mode + + sf::Vertex tris[3] = + { + sf::Vertex(sf::Vector2f(triangle[0].x(), triangle[0].y()), triangle.color), + sf::Vertex(sf::Vector2f(triangle[1].x(), triangle[1].y()), triangle.color), + sf::Vertex(sf::Vector2f(triangle[2].x(), triangle[2].y()), triangle.color) + }; + window.draw(tris, 3, sf::Triangles); +} + +void Screen::title(const std::string& title) +{ + name = title; +} + +bool Screen::isOpen() { + return window.isOpen(); +} + +void Screen::close() { + window.close(); +} + +bool Screen::isKeyPressed(sf::Keyboard::Key key) { + return sf::Keyboard::isKeyPressed(key); +} + +Point4D Screen::getMousePosition() const { + sf::Vector2 pos = sf::Mouse::getPosition(window); + return Point4D(pos.x, pos.y, 0, 0); +} + +Point4D Screen::getMouseDisplacement() const { + sf::Vector2 disp = sf::Mouse::getPosition(window) - sf::Vector2(w/2, h/2); + setMouseInCenter(); + return Point4D(disp.x, disp.y, 0, 0); +} + +void Screen::setMouseInCenter() const { + sf::Mouse::setPosition({ w / 2, h / 2 }, window); +} + +void Screen::setMouseCursorVisible(bool visible) { + window.setMouseCursorVisible(visible); +} + +void Screen::keyboardControl() { + // Check all input after this condition please + if (!window.hasFocus()) + return; + + if(isKeyTapped(sf::Keyboard::Num1)) + setMode(ViewMode::Default); + if(isKeyTapped(sf::Keyboard::Num2)) + setMode(ViewMode::Borders); + if(isKeyTapped(sf::Keyboard::Num3)) + setMode(ViewMode::Transparency); + if(isKeyTapped(sf::Keyboard::Num4)) + setMode(ViewMode::Frame); + if(isKeyTapped(sf::Keyboard::Num5)) + setMode(ViewMode::Xray); + if(isKeyTapped(sf::Keyboard::Num6)) + setMode(ViewMode::Clipped); + if(isKeyTapped(sf::Keyboard::Num7)) + setMode(ViewMode::Normals); +} + +bool Screen::isKeyTapped(sf::Keyboard::Key key) { + if (!Screen::isKeyPressed(key)) + return false; + + if(tappedKeys.count(key) == 0) { + tappedKeys.emplace(key, Time::time()); + return true; + } else if((Time::time() - tappedKeys[key]) > 0.2) { + tappedKeys[key] = Time::time(); + return true; + } + return false; +} + +bool Screen::isButtonPressed(sf::Mouse::Button button) { + return sf::Mouse::isButtonPressed(button); +} + +bool Screen::isButtonTapped(sf::Mouse::Button button) { + if (!Screen::isButtonPressed(button)) + return false; + + if(tappedButtons.count(button) == 0) { + tappedButtons.emplace(button, Time::time()); + return true; + } else if((Time::time() - tappedButtons[button]) > 0.2) { + tappedButtons[button] = Time::time(); + return true; + } + return false; +} + + +void Screen::debugText(const std::string& text) { + sf::Text t; + + t.setFont(*ResourceManager::loadFont(font)); + t.setString(text); + t.setCharacterSize(30); + t.setFillColor(sf::Color::Black); + t.setPosition(10, 10); + + window.draw(t); +} + +void Screen::setRender(bool r) { + if(renderVideo && !r) { + std::string c = "ffmpeg -stats -r 60 -i ../film/png/%d.png -vcodec libx264 -crf 1 -pix_fmt yuv420p -frames " + std::to_string(frame) + " ../film/mp4/" + std::to_string(scene) + "_" + name + ".mp4"; + popen(c.c_str(), "w"); + frame = 0; + scene++; + } + renderVideo = r; +} diff --git a/engine/Screen.h b/engine/Screen.h new file mode 100755 index 0000000..8c396cc --- /dev/null +++ b/engine/Screen.h @@ -0,0 +1,92 @@ +// +// Created by Иван Ильин on 14.01.2021. +// + +#ifndef ENGINE_SCREEN_H +#define ENGINE_SCREEN_H + + +#include +#include "Triangle.h" +#include +#include +#include "utils/Time.h" + +class Screen { +public: + enum ViewMode { + Default = 0, + Frame, + Borders, + Xray, + Clipped, + Transparency, + Normals + }; +private: + int w = 1920; + int h = 1080; + + std::string name; + + sf::Color background; + + Screen::ViewMode vm = Screen::ViewMode::Default; + + std::map tappedKeys; + std::map tappedButtons; + + std::string font = "../engine/fonts/Roboto-Thin.ttf"; + + bool renderVideo = false; // performance heavy. I use this to make sequence of .jpg files of screen and then convert this to .mp4 file + int frame = 0; + int scene = 0; // the number of scene + + bool makeScreenShoot = false; +public: + sf::RenderWindow window; + + void open(int screenWidth = 1920, int screenHeight = 1080, const std::string& name = "engine", bool verticalSync = true, sf::Color background = sf::Color(255, 255, 255), sf::Uint32 style = sf::Style::Default); + + void display(); + void clear(); + + void line(const Point4D& p1, const Point4D& p2, sf::Color color = {0, 0, 0}); + void triangle(const Triangle& triangle ); + + void title(const std::string& title); + std::string title() const { return name; }; + + bool isOpen(); + + int width() const {return window.getSize().x;} + int height() const {return window.getSize().y;} + + void close(); + + static bool isKeyPressed(sf::Keyboard::Key key); // returns true if this key is pressed + bool isKeyTapped(sf::Keyboard::Key key); // returns true if this key is tapped and 1/5 sec passed (button bouncing problem solved) + + static bool isButtonPressed(sf::Mouse::Button button); // returns true if this button is pressed + bool isButtonTapped(sf::Mouse::Button button); // returns true if this button is tapped and 1/5 sec passed (button bouncing problem solved) + + Point4D getMousePosition() const; + Point4D getMouseDisplacement() const; + void setMouseInCenter() const; + void setMouseCursorVisible(bool visible); + + void setMode(ViewMode mode) { vm = mode; } + [[nodiscard]] ViewMode mode() const { return vm; } + + void keyboardControl(); + + void debugText(const std::string& text); + + void setRender(bool r); + bool isRender() const { return renderVideo; } + + void makeScreen() { makeScreenShoot = true; } +}; + + +#endif //INC_3DZAVR_SCREEN_H diff --git a/engine/Triangle.cpp b/engine/Triangle.cpp new file mode 100755 index 0000000..52f335e --- /dev/null +++ b/engine/Triangle.cpp @@ -0,0 +1,80 @@ +// +// Created by Иван Ильин on 13.01.2021. +// + +#include "Triangle.h" + +Triangle::Triangle () { + p[0] = Point4D{0,0,0,1}; + p[1] = Point4D{0,0,0,1}; + p[2] = Point4D{0,0,0,1}; +} + +Triangle::Triangle(const Point4D& p1, const Point4D& p2, const Point4D& p3, double w) { + p[0] = Point4D{p1.x(), p1.y(), p1.z(), w}; + p[1] = Point4D{p2.x(), p2.y(), p2.z(), w}; + p[2] = Point4D{p3.x(), p3.y(), p3.z(), w}; +} + +Triangle Triangle::operator*(const Matrix4x4 &matrix4X4) const { + return Triangle(*this) *= matrix4X4; +} + +Triangle &Triangle::operator*=(const Matrix4x4 &matrix4X4) { + p[0] = matrix4X4 * p[0]; + p[1] = matrix4X4 * p[1]; + p[2] = matrix4X4 * p[2]; + + return *this; +} + +Point4D Triangle::norm() const { + + Point4D v1 = p[1] - p[0]; + Point4D v2 = p[2] - p[0]; + + return v1.cross3D(v2).normalize(); +} + +Point4D Triangle::operator[](int i) const { + return p[i]; +} + +Point4D &Triangle::operator[](int i) { + return p[i]; +} + +Point4D Triangle::pos() const { + return (p[0] + p[1] + p[2])/3.0; +} + +Triangle::Triangle(const Triangle &triangle) { + clip = triangle.clip; + color = triangle.color; + p[0] = triangle[0]; + p[1] = triangle[1]; + p[2] = triangle[2]; +} + +bool Triangle::isPointInside(const Point4D &point) const { + Point4D triangleNorm = norm(); + + double dot1 = (point - p[0]).cross3D(p[1] - p[0]).dot(triangleNorm); + double dot2 = (point - p[1]).cross3D(p[2] - p[1]).dot(triangleNorm); + double dot3 = (point - p[2]).cross3D(p[0] - p[2]).dot(triangleNorm); + + if((dot1 >= 0 && dot2 >= 0 && dot3 >= 0) || (dot1 <= 0 && dot2 <= 0 && dot3 <= 0)) + return true; + return false; +} + +Triangle &Triangle::operator=(const Triangle &triangle) { + if(&triangle != this) { + clip = triangle.clip; + color = triangle.color; + p[0] = triangle[0]; + p[1] = triangle[1]; + p[2] = triangle[2]; + } + return *this; +} diff --git a/engine/Triangle.h b/engine/Triangle.h new file mode 100755 index 0000000..89351a0 --- /dev/null +++ b/engine/Triangle.h @@ -0,0 +1,45 @@ +// +// Created by Иван Ильин on 13.01.2021. +// + +#ifndef ENGINE_TRIANGLE_H +#define ENGINE_TRIANGLE_H + +#include "utils/Point4D.h" +#include "utils/Matrix4x4.h" +#include + +class Triangle { +public: + // This is for clipping debug: you can distinguish how this triangle was clipped + enum ClipMode { + None = 0, + Cropped, + Doubled, + Skipped + }; + ClipMode clip = None; + sf::Color color; + Point4D p[3]; // points in space + Point4D t[3]; // texture coordinates + + Triangle (); + Triangle (const Triangle& triangle); + Triangle (const Point4D& p1, const Point4D& p2, const Point4D& p3, double w = 1); + Triangle& operator=(const Triangle& triangle); + + [[nodiscard]] Point4D operator[] (int i) const; + [[nodiscard]] Point4D& operator[] (int i); + + [[nodiscard]] Point4D norm() const; + + // Operations with Matrix4x4 + [[nodiscard]] Triangle operator*(const Matrix4x4& matrix4X4) const; + Triangle& operator*=(const Matrix4x4& matrix4X4); + [[nodiscard]] Point4D pos() const; + + [[nodiscard]] bool isPointInside(const Point4D& point) const; +}; + + +#endif //INC_3DZAVR_TRIANGLE_H diff --git a/engine/World.cpp b/engine/World.cpp new file mode 100755 index 0000000..6a31605 --- /dev/null +++ b/engine/World.cpp @@ -0,0 +1,81 @@ +// +// Created by Иван Ильин on 13.01.2021. +// + +#include +#include +#include "World.h" +#include "utils/Log.h" +#include "Plane.h" + +using namespace std; + +void World::addMesh(const std::shared_ptr& mesh, const string &name) { + _objects.emplace(name, mesh); + Log::log("World::addMesh(): inserted mesh '" + name + "' with " + std::to_string(_objects[name]->triangles().size()) + " tris."); + +} + +void World::loadObj(const string &name, const string &filename,const std::string &materials, const Point4D& scale) { + _objects.emplace(name, std::make_shared(filename, materials, scale)); + Log::log("World::loadObj(): inserted mesh from " + filename + " with name '" + name + "' with " + std::to_string(_objects[name]->triangles().size()) + " tris."); +} + +void World::removeMesh(const string &name) { + _objToRemove.push_back(name); +} + +std::shared_ptr World::operator[](const string &name) { + if(_objects.count(name) == 0) + Log::log("World::operator[]: mesh '" + name + "' does not exist."); + return _objects.find(name)->second; +} + +std::pair World::rayCast(const Point4D& from, const Point4D& to) { + + std::pair result{Point4D{0, 0,0, -1}, ""}; + double minDistance = 10000; + + for(auto& object : _objects) { + if((object.first.find("im") != std::string::npos) || (object.first.find("point") != std::string::npos) || (object.first.find("nr") != std::string::npos)) + continue; + + for(auto& tri : object.second->triangles()) { + Triangle tri_translated(tri[0] + object.second->position(), tri[1] + object.second->position(), tri[2] + object.second->position(), 0); + + Plane plane(tri_translated); + auto intersection = plane.intersection(from, to); + double distance = (intersection.first - from).sqrAbs(); + if(intersection.second > 0 && distance < minDistance && tri_translated.isPointInside(intersection.first)) { + minDistance = distance; + result = {intersection.first, object.first}; + } + } + } + return result; +} + +void World::loadMap(const string &filename, const string &name, const Point4D &scale, const string &materials) { + auto objs = Mesh::LoadObjects(filename, materials, scale); + for(int i = 0; i < objs.size(); i++) { + string meshName = name + "_" + to_string(i); + addMesh(objs[i], meshName); + } +} + +void World::garbageCollector() { + for(auto& obj : _objToRemove) { + if(_objects.erase(obj) > 0) + Log::log("World::garbageCollector(): removed mesh '" + obj + "'"); + else + Log::log("World::garbageCollector(): cannot remove mesh '" + obj + "': mesh does not exist."); + } + _objToRemove.clear(); +} + +void World::removeMeshInstantly(const string &name) { + if(_objects.erase(name) > 0) + Log::log("World::removeMeshInstantly(): removed mesh '" + name + "'"); + else + Log::log("World::removeMeshInstantly(): cannot remove mesh '" + name + "': mesh does not exist."); +} diff --git a/engine/World.h b/engine/World.h new file mode 100755 index 0000000..dab4572 --- /dev/null +++ b/engine/World.h @@ -0,0 +1,38 @@ +// +// Created by Иван Ильин on 13.01.2021. +// + +#ifndef ENGINE_WORLD_H +#define ENGINE_WORLD_H + +#include +#include "Mesh.h" + +class World { +private: + std::map> _objects; + + std::vector _objToRemove; +public: + World() = default; + + [[nodiscard]] std::shared_ptr operator[] (const std::string& name); + + [[nodiscard]] std::map>& objects() { return _objects; } + + void addMesh(const std::shared_ptr& mesh, const std::string& name = ""); + void removeMesh(const std::string& name); + void removeMeshInstantly(const std::string& name); + void garbageCollector(); + void loadObj(const std::string &name, const std::string &filename,const std::string &materials = "", const Point4D& scale = Point4D{1, 1, 1}); + + // rayCast returns pair of Point4D and std::string: + // 1) Point4D is point of collision (the last coordinate is -1 if there are no collisions) + // 2) std::string - name of the object + std::pair rayCast(const Point4D& from, const Point4D& to); + + void loadMap(const std::string& filename, const std::string& name = "", const Point4D& scale = Point4D{1, 1, 1}, const std::string &materials = "../maps/materials.txt"); +}; + + +#endif //INC_3DZAVR_WORLD_H diff --git a/engine/animation/AColor.h b/engine/animation/AColor.h new file mode 100755 index 0000000..6465840 --- /dev/null +++ b/engine/animation/AColor.h @@ -0,0 +1,40 @@ +// +// Created by Иван Ильин on 02.06.2021. +// + +#ifndef ENGINE_ACOLOR_H +#define ENGINE_ACOLOR_H + +#include "Animatable.h" +#include "Animation.h" + +class AColor : public Animation { +private: + sf::Color newColor; + sf::Color startColor; + +public: + AColor(const sf::Color &color, double duration, LoopOut looped, InterpolationType interpolationType) { + _duration = duration; + _looped = looped; + _intType = interpolationType; + _waitFor = true; + + newColor = color; + } + + bool update(Animatable& obj) override { + if(!_started) + startColor = obj.color(); + + Point4D start(startColor.r, startColor.g, startColor.b, startColor.a); + Point4D end(newColor.r, newColor.g, newColor.b, newColor.a); + Point4D mid = start + (end - start)*_p; + + obj.setColor(sf::Color(static_cast(mid.x()), static_cast(mid.y()), static_cast(mid.z()), static_cast(mid.w()))); + + return updateState(); + } +}; + +#endif //SHOOTER_3DZAVR_ACOLOR_H diff --git a/engine/animation/AFunction.h b/engine/animation/AFunction.h new file mode 100755 index 0000000..e81ffd3 --- /dev/null +++ b/engine/animation/AFunction.h @@ -0,0 +1,36 @@ +// +// Created by Иван Ильин on 06.04.2021. +// + +#include + +#include "Animation.h" + +#ifndef ENGINE_AFUNCTION_H +#define ENGINE_AFUNCTION_H + +class AFunction : public Animation { +private: + int _calls = 0; + int _allCalls = 1; + std::function _callBack; + +public: + AFunction(std::function function, int calls, double duration, LoopOut looped, InterpolationType interpolationType) { + _callBack = std::move(function); + _allCalls = calls; + _duration = duration; + _looped = looped; + _intType = interpolationType; + } + + bool update(Animatable& obj) override { + if(_allCalls != 0 && _p >= (double)(_calls+1) / (_allCalls+1)) { + _calls++; + _callBack(); + } + return updateState(); + } +}; + +#endif //MINECRAFT_3DZAVR_AFUNCTION_H diff --git a/engine/animation/ARotate.h b/engine/animation/ARotate.h new file mode 100755 index 0000000..d346330 --- /dev/null +++ b/engine/animation/ARotate.h @@ -0,0 +1,29 @@ +// +// Created by Иван Ильин on 29.01.2021. +// + +#ifndef ENGINE_AROTATE_H +#define ENGINE_AROTATE_H + +#include "Animatable.h" +#include "Animation.h" + +class ARotate : public Animation { +private: + Point4D value; +public: + ARotate(const Point4D& r, double duration, LoopOut looped, InterpolationType interpolationType) { + _duration = duration; + _looped = looped; + _intType = interpolationType; + + value = r; + } + + bool update(Animatable& obj) override { + obj.rotate(value * _dp); + return updateState(); + } +}; + +#endif //INC_3DZAVR_AROTATE_H diff --git a/engine/animation/AScale.h b/engine/animation/AScale.h new file mode 100755 index 0000000..b57ba31 --- /dev/null +++ b/engine/animation/AScale.h @@ -0,0 +1,39 @@ +// +// Created by Иван Ильин on 29.01.2021. +// + +#ifndef ENGINE_ASCALE_H +#define ENGINE_ASCALE_H + +#include "Animatable.h" +#include "Animation.h" + +class AScale : public Animation { +private: + Point4D value; + + std::vector triangles; +public: + AScale(const Point4D &s, double duration, LoopOut looped, InterpolationType interpolationType) { + _duration = duration; + _looped = looped; + _intType = interpolationType; + _waitFor = true; + + value = s; + } + + bool update(Animatable& obj) override { + if(!_started) + triangles = obj.triangles(); + + std::vector newTriangles; + for(auto &t : triangles) { + newTriangles.emplace_back(t * Matrix4x4::Scale(Point4D{1, 1, 1} + (value - Point4D{1, 1, 1}) * _p)); + } + obj.setTriangles(newTriangles); + return updateState(); + } +}; + +#endif //INC_3DZAVR_ASCALE_H diff --git a/engine/animation/ATranslate.h b/engine/animation/ATranslate.h new file mode 100755 index 0000000..4b469c3 --- /dev/null +++ b/engine/animation/ATranslate.h @@ -0,0 +1,33 @@ +// +// Created by Иван Ильин on 29.01.2021. +// + +#ifndef ENGINE_ATRANSLATE_H +#define ENGINE_ATRANSLATE_H + +#include "Animatable.h" +#include "Animation.h" + +class ATranslate : public Animation { +private: + Point4D value; +public: + ATranslate(const Point4D& t, double duration, LoopOut looped, InterpolationType interpolationType) { + _duration = duration; + _looped = looped; + _intType = interpolationType; + + value = t; + } + + bool update(Animatable& obj) override { + obj.translate(value * _dp); + return updateState(); + } + + [[nodiscard]] int type() const override { + return 2; + } +}; + +#endif //INC_3DZAVR_ATRANSLATE_H diff --git a/engine/animation/ATranslateToPoint.h b/engine/animation/ATranslateToPoint.h new file mode 100755 index 0000000..223dafc --- /dev/null +++ b/engine/animation/ATranslateToPoint.h @@ -0,0 +1,34 @@ +// +// Created by Иван Ильин on 29.01.2021. +// + +#ifndef ENGINE_ATRANSLATETOPOINT_H +#define ENGINE_ATRANSLATETOPOINT_H + +#include "Animatable.h" +#include "Animation.h" + +class ATranslateToPoint : public Animation { +private: + Point4D point; + Point4D value; +public: + ATranslateToPoint(const Point4D& p, double duration, LoopOut looped, InterpolationType interpolationType) { + _duration = duration; + _looped = looped; + _intType = interpolationType; + + point = p; + } + + bool update(Animatable& obj) override { + if(!_started) { + value = point - obj.position(); + } + obj.translate(value * _dp); + + return updateState(); + } +}; + +#endif //INC_3DZAVR_ATRANSLATETOPOINT_H diff --git a/engine/animation/AWait.h b/engine/animation/AWait.h new file mode 100755 index 0000000..eab8b17 --- /dev/null +++ b/engine/animation/AWait.h @@ -0,0 +1,30 @@ +// +// Created by Иван Ильин on 29.01.2021. +// + +#ifndef ENGINE_AWAIT_H +#define ENGINE_AWAIT_H + +#include "Animatable.h" +#include "Animation.h" + +class AWait : public Animation { +private: + Point4D value; +public: + explicit AWait(double duration) { + _duration = duration; + _intType = linear; + _waitFor = true; + } + + bool update(Animatable& obj) override { + return updateState(); + } + + [[nodiscard]] int type() const override { + return 1; + } +}; + +#endif //INC_3DZAVR_AWAIT_H diff --git a/engine/animation/Animatable.cpp b/engine/animation/Animatable.cpp new file mode 100755 index 0000000..65fa8f1 --- /dev/null +++ b/engine/animation/Animatable.cpp @@ -0,0 +1,91 @@ +// +// Created by Иван Ильин on 26.01.2021. +// + +#include "Animatable.h" +#include +#include + +#include "ATranslate.h" +#include "ATranslateToPoint.h" +#include "ARotate.h" +#include "AScale.h" +#include "AWait.h" +#include "AFunction.h" +#include "AColor.h" + +void Animatable::a_translate(const std::string& listName, + const Point4D &t, + double duration, + Animation::LoopOut looped, + Animation::InterpolationType interpolationType) { + animations[listName].emplace_back(new ATranslate(t, duration, looped, interpolationType)); +} + +void Animatable::a_translateToPoint(const std::string& listName, + const Point4D &point, + double duration, + Animation::LoopOut looped, + Animation::InterpolationType interpolationType) { + animations[listName].emplace_back(new ATranslateToPoint(point, duration, looped, interpolationType)); +} + +void Animatable::a_rotate(const std::string& listName, + const Point4D &r, + double duration, + Animation::LoopOut looped, + Animation::InterpolationType interpolationType) { + animations[listName].emplace_back(new ARotate(r, duration, looped, interpolationType)); +} + +void Animatable::a_scale(const std::string& listName, + const Point4D &s, + double duration, + Animation::LoopOut looped, + Animation::InterpolationType interpolationType) { + animations[listName].emplace_back(new AScale(s, duration, looped, interpolationType)); +} + +void Animatable::a_color(const std::string &listName, const sf::Color &color, double duration, Animation::LoopOut looped, + Animation::InterpolationType interpolationType) { + animations[listName].emplace_back(new AColor(color, duration, looped, interpolationType)); +} + +void Animatable::a_wait(const std::string& listName, double duration) { + animations[listName].emplace_back(new AWait(duration)); +} + +void Animatable::a_function(const std::string &listName, + std::function function, + int calls, + double duration, + Animation::LoopOut looped, + Animation::InterpolationType interpolationType) { + animations[listName].emplace_back(new AFunction(std::move(function), calls, duration, looped, interpolationType)); +} + +void Animatable::a_update() { + + for (auto& [listName, animationList] : animations) { + + if (animationList.empty()) + continue; + auto it = animationList.begin(); + // If it the front animation is 'a_wait()' we should wait until waiting time is over + + if (it.operator*()->waitFor()) { + if (!it.operator*()->update(*this)) + animationList.erase(it); + continue; + } + + + // Otherwise we iterate over all animation until we meet animations.end() or wait animation + while (!animationList.empty() && (it != animationList.end()) && (!it.operator*()->waitFor())) { + if (!it.operator*()->update(*this)) + animationList.erase(it++); + else + it++; + } + } +} diff --git a/engine/animation/Animatable.h b/engine/animation/Animatable.h new file mode 100755 index 0000000..87574f8 --- /dev/null +++ b/engine/animation/Animatable.h @@ -0,0 +1,92 @@ +// +// Created by Иван Ильин on 26.01.2021. +// + +#ifndef ENGINE_ANIMATABLE_H +#define ENGINE_ANIMATABLE_H + +#include +#include "../Triangle.h" + +//class Animation; +#include "Animation.h" +#include +#include + +// All _objects in 3dzavr that should be animated must inherit class Animatable: +class Animatable { +protected: + std::map> animations; + +public: + Animatable() = default; + virtual ~Animatable() = default; + // All methods about animation begins with 'a_' + void a_translate(const std::string& listName, + const Point4D& t, + double duration = 1, + Animation::LoopOut looped = Animation::None, + Animation::InterpolationType interpolationType = Animation::bezier); + void a_translateToPoint(const std::string& listName, + const Point4D& point, + double duration = 1, + Animation::LoopOut looped = Animation::None, + Animation::InterpolationType interpolationType = Animation::bezier); + + void a_rotate(const std::string& listName, + const Point4D& r, + double duration = 1, + Animation::LoopOut looped = Animation::None, + Animation::InterpolationType interpolationType = Animation::bezier); + + void a_scale(const std::string& listName, + const Point4D& s, + double duration = 1, + Animation::LoopOut looped = Animation::None, + Animation::InterpolationType interpolationType = Animation::bezier); + + void a_wait(const std::string& listName, double duration = 1); + + void a_function(const std::string& listName, + std::function function, + int calls = 1, + double duration = 1, + Animation::LoopOut looped = Animation::None, + Animation::InterpolationType interpolationType = Animation::bezier); + + void a_color(const std::string& listName, + const sf::Color& color, + double duration = 1, + Animation::LoopOut looped = Animation::None, + Animation::InterpolationType interpolationType = Animation::bezier); + + + void a_update(); + + void a_stopAllAnimations() { animations.clear(); } + void a_stopAnimationList(const std::string& name) { animations[name].clear(); } + + [[nodiscard]] bool isInAnim() const { + for(auto& animList : animations) + if (!animList.second.empty()) + return true; + return false; + + } + [[nodiscard]] bool isInAnimList(const std::string& name) { return !animations[name].empty(); } + + // methods to override: + // If you want to create new animation you can either add new virtual function here + // or override one of the following function: + [[nodiscard]] virtual Point4D position() const { return Point4D{}; } + [[nodiscard]] virtual Point4D angle() const { return Point4D{}; } + virtual void translate(const Point4D& dv) {} + virtual void rotate(const Point4D& r) {} + [[nodiscard]] virtual std::vector& triangles() { return *(std::vector*)(new std::vector()); } + virtual void setTriangles(const std::vector& tris) {} + + [[nodiscard]] virtual sf::Color color() const {return sf::Color(); } + virtual void setColor(sf::Color c) { } +}; + +#endif //INC_3DZAVR_ANIMATABLE_H diff --git a/engine/animation/Animation.cpp b/engine/animation/Animation.cpp new file mode 100755 index 0000000..1adac2b --- /dev/null +++ b/engine/animation/Animation.cpp @@ -0,0 +1,49 @@ +// +// Created by Иван Ильин on 27.01.2021. +// + +#include "Animation.h" + +#include +#include "../utils/Log.h" + +bool Animation::updateState() { + if(!_started) { + _startAnimationPoint = Time::time(); + _endAnimationPoint = _startAnimationPoint + _duration; + _started = true; + return _duration != 0; + } + + _timeOld = _time; + // linear normalized time: + _time = (Time::time() - _startAnimationPoint)/(_endAnimationPoint - _startAnimationPoint); + + if(_looped != Continue || _time < 0.5) + _dtime = _time - _timeOld; + else { + _time = _timeOld; + //_intType = linear; + } + + switch (_intType) { + case bezier: + _p = Interpolation::Bezier(_bezier[0], _bezier[1], _time); + _dp = Interpolation::dBezier(_bezier[0], _bezier[1], _time, _dtime); + break; + case bouncing: + _p = Interpolation::Bouncing(_time); + _dp = Interpolation::dBouncing(_time, _dtime); + break; + case linear: + _p = Interpolation::Linear(_time); + _dp = Interpolation::dLinear(_time, _dtime); + break; + case cos: + _p = Interpolation::Cos(_time); + _dp = Interpolation::dCos(_time, _dtime); + break; + } + + return (_time < 1) || _looped == Cycle; +} \ No newline at end of file diff --git a/engine/animation/Animation.h b/engine/animation/Animation.h new file mode 100755 index 0000000..0ec26fa --- /dev/null +++ b/engine/animation/Animation.h @@ -0,0 +1,62 @@ +// +// Created by Иван Ильин on 26.01.2021. +// + +#ifndef ENGINE_ANIMATION_H +#define ENGINE_ANIMATION_H + +#include "../utils/Time.h" +#include "../Triangle.h" +#include "Interpolation.h" + +class Animatable; + +class Animation { +public: + enum InterpolationType { + linear, + cos, + bezier, + bouncing + }; + enum LoopOut { + None, + Cycle, + Continue + }; +protected: + double _time = 0; // normalized time (from 0 to 1) + double _dtime = 0; + double _timeOld = 0; + + double _endAnimationPoint = 0; + double _startAnimationPoint = 0; + double _duration = 0; + bool _started = false; + LoopOut _looped = None; + // p - animation progress + double _p = 0; + double _dp = 0; + + InterpolationType _intType = bezier; + Point4D _bezier[2] = {Point4D{0.8, 0}, Point4D{0.2, 1}}; + + // If '_waitFor' == true then we need to finish all animation before starting this one. (for example for a_wait() or a_scale()) + bool _waitFor = false; + + bool updateState(); +public: + Animation() = default; + virtual ~Animation() = default; + + void setBezierParams(const Point4D& p1, const Point4D& p2) { _bezier[0] = p1; _bezier[1] = p2; } + [[nodiscard]] bool waitFor() const { return _waitFor; } + + + // You should override this method for your particular animation + virtual bool update(Animatable& obj) = 0; + + [[nodiscard]] virtual int type() const{return 0;} +}; + +#endif //INC_3DZAVR_ANIMATION_H diff --git a/engine/animation/Interpolation.h b/engine/animation/Interpolation.h new file mode 100755 index 0000000..9d0d135 --- /dev/null +++ b/engine/animation/Interpolation.h @@ -0,0 +1,86 @@ +// +// Created by Иван Ильин on 26.01.2021. +// + +#ifndef ENGINE_INTERPOLATION_H +#define ENGINE_INTERPOLATION_H + +#include "../utils/Point4D.h" +#include + +namespace Interpolation { + static double Linear(double t); + static double Cos(double t); + static double Bezier(const Point4D& p1, const Point4D& p2, double t); + static double Bouncing(double t); + + static double dLinear(double t, double dt); + static double dCos(double t, double dt); + static double dBezier(const Point4D& p1, const Point4D& p2, double t, double dt); + static double dBouncing(double t, double dt); +}; + +double Interpolation::Linear(double t) { + if(t < 0) + t = -t; + return ((int)trunc(t) % 2) ? 1.0 - (t-trunc(t)) : (t-trunc(t)); +} + +double Interpolation::Cos(double t) { + return 0.5*(1 - cos(M_PI*Interpolation::Linear(t))); +} + +double Interpolation::Bezier(const Point4D &p1, const Point4D &p2, double t) { + t = Interpolation::Linear(t); + + double h = 0.000001; + double eps = 0.000001; + + // We are trying to find 's' when px = t + auto f = [=](double s){ + return 3.0*(1.0-s)*(1.0-s)*s*p1.x() + 3.0*(1.0-s)*s*s*p2.x() + s*s*s - t; + }; + // Using found 's' we will calculate resulting py + auto py = [=](double s){ + return 3.0*(1.0-s)*(1.0-s)*s*p1.y() + 3.0*(1.0-s)*s*s*p2.y() + s*s*s; + }; + + auto df = [=](double s){ + return (f(s+h) - f(s-h))/(2.0*h); + }; + + // Newton method + double s1 = 0.0, s2 = 0.5; + int i = 0; + + while(std::abs(s1 - s2) > eps) { + s1 = s2; + s2 = s1 - f(s1) / df(s1); + i++; + } + + return py(s1); +} + +double Interpolation::Bouncing(double t) { + t = Interpolation::Linear(t); + return 0.5*(1.0/(1.0 + exp(10.0*(-4.0*t+0.8))) + (1.0 + 2.5*sin(50.0*(t - 1.0/3.0))*exp(-7.0*t))/(1.0+exp(10.0*(-15.0*t + 3.1)))); +} + +double Interpolation::dLinear(double t, double dt) { + return ((int)trunc(t) % 2) ? -dt : dt; +} + +double Interpolation::dCos(double t, double dt) { + return 0.5*M_PI*sin(M_PI*t)*dt; +} + +double Interpolation::dBezier(const Point4D &p1, const Point4D &p2, double t, double dt) { + return Interpolation::Bezier(p1, p2, t + dt) - Interpolation::Bezier(p1, p2, t); +} + +double Interpolation::dBouncing(double t, double dt) { + return Bouncing(t + dt) - Bouncing(t); +} + +#endif //INC_3DZAVR_INTERPOLATION_H diff --git a/engine/fonts/Roboto-Light.ttf b/engine/fonts/Roboto-Light.ttf new file mode 100755 index 0000000000000000000000000000000000000000..35267989deca17116c70c987e90035303e2e3404 GIT binary patch literal 170012 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 literal 0 HcmV?d00001 diff --git a/engine/fonts/Roboto-Medium.ttf b/engine/fonts/Roboto-Medium.ttf new file mode 100755 index 0000000000000000000000000000000000000000..f714a514d94e495095e2f1e525a341eade187c17 GIT binary patch literal 171656 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 z zOo9(|yc~T#`9gAaa!s<9|6w*K-$!rt!{m;{?EBxD{D`&HceC!b#EW?FXq5N*jkXGV zB}v}ncf!A#=&fE&USqs5d;f2mmYdH$hjSorx+_=VdZCjVgQueL?ie@0O-AoD#WlKS zH&-sjFZ%kThj!V3Hs@P%gWM?JmYZawWF?1Ar!)1~Ui8*3x1iIx4gJjz(A8`~FLO7V zn5}4C?nlG&p!`f8mPgRCJSxAG$7C4@8|pbfqt+b>JRbnNAqzw`i?J`(<|NcQhTqM!GBj>q$d{0_gX0*?L(+v+07e7p;Mndp&Ryhn4Xa&NC51Z~zUv)S{*$HAQ!Pfm z0LMjl_@Ouoerm;rr z#Y{BH&xXnKhL;yZdNf{1m;N&_D_;V3FvG25R(vqhf#GQ7$04WpU~_V<|0K{e$Zlnjx#>>5V47Trv^OTQV?=BfAg9h>vjA^ryz&tcSK zgOnV11k5{W+LEW~tCkmih|y&2%^C_|C+kU!rW=6i)3}Rp7y1ONVS49>xyqqSAO<}g zxyxF~c!bp$A@=7Mi+;tP^eQ0y5ooma4LS4>Ms+!#7$@Y=b{S>sfmyU&)>`&VJJc|d z|27he{AYDf`L8q7-LBqQuGJ}r*2>EL7BGv}%BVUP*r8ts#⪼1irKO40j0qy1+I1 zZ{TyXFWl)rLYkDHo(eI~gqZ&fF|oFL4UZ1T$}8ok7ee}%Li$@RR@VWuXz8t`%G<@B zM-Hu+(N8U*zZuvm#@!vd0T}7Oolq$ky=~Xtg?m^}?Lq@(Y13z!3Gux{{0}Xj!?>t6 zVE!v$$|mLyA-fKt4;Mm57D8w@i7jn)_?6XDfSvLv zutWb9xT!Ry&IXgy1;8$y3(Vr#+o<_Cu%j&H956Zl7`2r1fLZ<^wUlQ8%Tq1_lhY-@ zE*_z>&xGOP<4 z!}vCiRX^CBVWkhgN|*&5#4M;8y~s4?KDMrJ9^;hFd4?xz*pE!EWdAVppU<+o$UHrM zgc;D)jAQGP>#>ruoqa6#%)g`HkRW5mQ=CZ+Bi2?IR^XqlGEG^aW1|LB9+8%t6S zC$@%KH-J~SnKbB?32h-{l&CY_wvgRvR`L}>h1xmuN9ky>Qryyj+gyfwIpFXyS!jbH zteZK~JUA9G)nG=5r4d?nT1gClPs_=y?m0!K$fsR!%VJX1u=48&p6O^> zKF(#E@-x?B*{mp#C9+hEHqTRTk_$`9AAwJtIWk{n$#j`1Gi0vJmNR9Zv`V8i$y8~U z7T)_qWT99OW~BlW#Y7g#BG%n3lV#|iuU7jbym&uK)azs!_%G_0^cuZZ7U^33GG(<; zS`#Ion+%eLl-Wp$k}q+(%;&9ERtmJ7Swh)tsG0+JmilotFOCP2%jPDOmr~3ZV#&J<=H^lghJGJn{TBSAVMZ3*sJ(9JL z%`uDov4$(W1CcZ0Y~E=p+QYSJ43K=f>)drj-{bD3)CM`67Ea3$R^wH>d)<%SJ;c19 o8QozrO#Y5E#T0{h3dbj(#4GJ8IYB1MB$+HH%1M-LZNiiKBS^I^fB*mh literal 0 HcmV?d00001 diff --git a/engine/fonts/fontRU.ttf b/engine/fonts/fontRU.ttf new file mode 100755 index 0000000000000000000000000000000000000000..9466430fb0e25772dcf024c46bdfa181e3ba5eb0 GIT binary patch literal 70612 zcmeFa31DAUl|O#(`|kU`@856oO`4=h({GlxY11u~(j_$ANXu3vKwC;EAPg#-3Md5? z83b_`Hyk(IOReiT4sKYLaYbcZQPCL@5s@bU&*$Fvl5|CX;|R{b-{jr5-+S)4=bm%! zx#ylIq!1#E#4f~|jT=^OJmVL6A)F5iAs3&zp=<61%O-nq{Bk_CZS&CD(TiPIyjlo% zTnNX*=U#Nq?w7vnrjH2GwjbwX=U(yrvcMf7x?hXLIDhvA7df}Qpk9vAyU%aVR?O%QUqmvIz4%!~Ey#(hTVel$`c*pqdq*DmnBe?%nyv3Ym{Nwg8H>$TYL#x{!WMx4I~?|ll#s2N~tm77GXQ4lS--hzBe@&&lY{cYG^AyUZGD_@E7 zZxcSFAwu%~*lrPad8tUTE)pYskt?w9l{E)Y}>;&V+ifRwq`re*u2 z%43-<8}AznMaWo-duL%=fNTGP{BA(mgo)elk>3P3#{01Us_+`0M0PZuj7w z8JqDTTw~n{GwaWMkjGRV2{+5bKR>1pCrq@!ZpkUaq>6fEU^jc* zkX|6pM7mv^HTi3?L!6Ctr`U${LU9h#T`IjuJa6(>VqBby^kOlFbhkJU=_TTPq?d{d zCVwd|6WftKU+h47x!8&H3YGqoxN!0jai!RW^abJ~q%RcXNM9r_MtYUlJ^2f9wYUW7 zHR4jF*NV%KUZ>I*i|0@NT)aeFj`XGC3Z&PIe?oeLxDx4&;sr=wCSExCGx2iqBBVEo ztB~$d>CNJ59N!|Ynf$4Eg}4^!E5&t4UnO3Q^j7f_q^}k)o&1ToOnHzB=C>_PfEaWm4_i(4lDQ@laE0_hu7`X=#89KTt-3h7(K zt&1W0J zk$z5m0O`Mqdy#%#d~ou+;@?#I1@R#q|GW4w()-0nkbY5o6zP}5$DloYS$rJnSHxbV zUlsQueL$sO6Z%QrLGkIyZ;Ag9pF#R9@mZwb7N0}< z9hH7p{Oja@2ta}K`{Lh_J|whkEE3_j%J$**H9g({4EIPF(Qd053?s>99*Tj%`eE3lQMM<-%j? z=RnCeW+7PMjGtQ{AM?KTC;+zEoCH|?%zSM&RM+OjnFFcQ!H4V)C!w2u&W3w7+%m7) z)LuQzBL_f*ko0;DVHggVgMbr%xPf=nzs8>%C&=G{Cx}1(_%@5e1psiI`@Cu5&uc>) zDF|&|9uTp*6rjQZ{1I@VieR{0s?l&kw->U&vu4SPSO@I!`t+U<6!YAQf^8THi#PXVW% zKhAygLDn7EuwKIvPFXV+<087)Sn45%)9rAZrKm~+dqksS3V(bY@8D@1IYAqsKfiw( zf5?|~rrzOuHk>#d9ww?#pq5$iRAqsOZ4Q$7G4J!H0@dO4+t5ZXHh|5?1C2j`VR&(D zR|zxJ__Hda@W_i6{#Y1)UcEc!eSKSlX?IW63GlNjY!WsTp921XK(w&ajX%K0AMXHv z>H(*&v|a7-EKc!n;x7OK8z~;vRUNOiGK$Ko`o+S1# zIjqy^!#Q)n6HbSRC!k>$Gh=Uby3sDjyw95;9z5y}**z|shp*X#Ja9SJ_I`SxqP5S^&`=MY`sogAj0r-0&BpWSK|-h*onVL#3pPu zyr}podZ;c*y+ID^a{2KnsKy03;&OVYYJtp%KbMC!JJx;PMBUkj5#kT<0MEc58W!}7 z+&wOP0L0-4ut$JDkoh`&K1B$)t>{n*V~syuJW>;X$Gi{B5O_BLMi&CY^_wRC*o$!) zrMO)_AdnBaJ$|ppLib^t@n;dk48E-#pNga;sRX76>|gXlWW zAQ%z(9r5S#`&C6yj8D}DS=ijVWERF>h{ly$|^i7xFtdNTY223d~2+BYy9+w}j zg@>FTZ@?2k_f)?CQV^@(#r}$y@N)sb$j`@9`~z^}FOg9A3wQvy!k>CpCklV=5VHUP zc*5f{@rV0#ivjd4;4haW{_rB0n-7V@%PjQI;lSP- z;|bozO`j)3YR9S1ha)fefG_A$7mj|PH&JzG$=k@b-uQ%*t?*sQBP%Opo z4TmEkKgcc+jQL{$z{eje?Fo7#d@m4Em%RS4A5Ta8I7K!=bUfg%P;dwU7xhD`qpoh$ z2_^Z}pTeInjx2yHAD+PL1OsPiEF3{L`$AwN$GjhM;WdT7P{9@PIU@>xSsWl2hXZeh ze9k1O)13tFrtlYw#(eBne!nIN;t$WNqSXzbFZm4jaa%plI-_=8KM~^vCa3V{^+uz7 zDiVoC0=N|n#RKtRQ0E&*oxCAml%)kxRb=K3M36}&8bBTqpFiYR_$!x*zd$?y`4b2L ze||6@{J6t)9Hat4e-Nz@bh`06@8P095Df+>uL5EBaqinG77S>hXW%dBLsq;G&|<`2z#WLpz~2$~aTB=!)Ig-7 z@aGEy_=1H$OUJ|5Nh1HL5=VQ(y0^y2!%teVK7KVE~IOQvQ&Bb zXSk2Y_+}^`4h4egP{2eC@&oIF)S>iErBFmLnMfwWXq;#)6Ujy*xP)I8<$y%e!EiVf zjkAKmKqQGw63H;~NCZPMFfQP)t<5D|u5dOAt{RCzod|<@M4GVB5B||L|xAXE~S60UL;c1C&#>x+hM#B1Hi#hE*6T$2xTZ8215)( zdJ(8B&=n15GMRKN0-PiYu|hl^i$(E6r6a*aC>M@KBZ*Wjg11Al3^K`NV(Ca2l}|?8 zLEx{mllY4jVvyg_C=^J(4gSs4!;?sv$0$7R@yEiMI8F#xG#igb{84{25t#eCI3I2x$>!Q}(~DEe|BoX_W@G4;zStWk-H>XHGL zs$umR?z0B?k7wesaHJ5A#1m1rKsFjhW1^)9RG~oLm&@f*mvA_hDksXxBzP}=taLaP zDMW$L6e^9vBZ(X`$>rnOXe1kprP1+#zqxZUvFMJM6P|!S9!H0aCE{`X$B=qF$SGQl zCt@f(p7aJ1kz6tnPb6ZDAhFdGW-;5yj6dO`+N|8NdO#)mXpyW3I-C2 zafsL$I2c56q*O{IlCeUuR7j#*WU|#%EuBuPa%y-V$S%ilnn4~wYcy3rCdE<`L|RNF zvI%b(`0MK<{*u)sG{Zy!ieVy&9};Bk^%CM{p2lN|lsA}+7E-(yN4CXOA`U)~$OVsc zKgT?&C?s-y!E)SJj%LBM=imVFxxFYPmkhLqVu?^|FhGu)fEp2wRjbuF!AK=bz*wAF z_;A9X0uS%C^5i)8&1$3oa5P>`#Zqa7eGnKL6F7thj$)8SqExPw(upW2t2tB8WK!za zjDn*1cr}qqC3DCl1w>~`$fR6J1MA2ppY%q7zXc00rR_;IrNHS^DR0;dpmY{E^WrGc znoi@rcq-!yrQ@XxZzqs#C6h`(-lqzoPWPlB2%EC^K-zG^HBrrp2+vhetjeIXTW z3nx)!ETGaEU@%ufCe>P| z!feu|v@ZtyEnn`%97wh;?~g=sxj-}k-mQMQY&HkygILKtO-as~&t7gO9(R41_9RZh* zMRI{KSWA0bdm2UO^0}5QYlAF;xq<~2_PNa5XSk27@l>|ZT*#-=?S*uqNVqfgELc}2 z6M&S;XGEK!|Y&j0{`Jz9FQtHK6e1{Mc~-fU&CMz2%9VVfkju3f3W-EM z&mNr3c6F6XSrOWw3uGU_z6gp;?+w+C? zVyUGROap)TaT*Sr?Q`_6#4nFC92sTdG&n^fF#Dsyjv3RYDvMHB?B*(9AGKHYo#R0@KmY7 zL!}9xDRp?Hw8G=E4IU^R@I2{+$H^Rcn#>gqc$f6TtE3;^B=g}#G9VVhb7T-6BTL{Z zvJ4&~L+}h)0gsTC@B~=}50EwR{1}GE$2xd=tcQokMtF8?hDXOJJUO<)gX0W%Zk&Y* zy&ir9Z-URjJ(%hLFy`t%j+y#TV4i+I=Hx$v8Trp*4*v6)f&Vx01?B zFn@jkv*+K0PX_!S;7f5WJUd>2dH);5i{Z<03%n=rL z(E@g~Mh!k7Z^N4(fd|8++#t`9SITRQFBlKm{q`>VsrEDMXWL(0j+e9LV!2wbm*s&UB-n%4suh_C@5A)nGTC3c9-JU(U zJ*bCyzE^zaunSTgeqo7u0hmA@z{E*=<#p?j8FsZwju&c`S_N=!8A92fj@27RPXeTs zEwjO*AsyoAzY?B|-;_IzUy5$&+Xo?oF5SKl;-ww?r8!8WC?rl4QY8v*5QTJzLIOm= zQKRsWi-J=}!F{9Plu_{QDENC+1kPOQfD2R|f! ziWA3q9JAyi_C;K?;kbljfqfPGDy|WV20hAJAxBwp2c)g7eNK0*r?0=aktoW7to8QP zYgK0=UbH9TPFJGV+bI{xMk1bU%9jX5Sg>_qU^|qILU~UAobtkftqTXXm$KQC zIyJl}pBCup@t?LbS*Vvv^`@TL?R_WDT{-G+H2kA0=k(X1C+Uk^QvuIXW5oC@q<;p| zeHNtki}xv2fZ)aO0QVH{+;>CdaG!&!&>e}+--lQ9(O%Jwy3MEOTnH7-V#{~!gN*4> zFBoW5zBn7&f~_6T;9(D%h5OtAYCB zH6Qct_NEB5=B5>WJw1Kg|g^Ceg00kf6E_%<1k2{nUZ6 zz5$s4@c>=P0SSU?Bx)d>RIO9CDE##+D(degfz7JTS~IfYnya$KT4~OBpty6WlS;dR58UOK!E<+e_~0s8MwG%4`RUcjvB%V1Lk zN-pRog%cZgYyuEC0Uoh2r<-}ZYW=M{=gcnbJp1A?yvMr84rq0^BD);PiFqOe6IPn82O<&`Gg5;BPUt~uT0F*0-Z z#G_{$`wtG02b91AE;2rk(NRwHld*y0W6J}g-~ntnCRI@iB(N_KN*nqwQ4s-csggDS z1}TxMHCH2vk*mFe%$wWz=8=)j+}=vgEnmpgwdwTJH%;8ml(pD}qzf>61v2NHJ?qJm z-6jNnV%q_bT&k^g>9M(kMt>txi_~_NXJy0ARpXnCv0%C!Jvd}=;I8l|ccYGF@y5NP zg4czXlme0xIM9+(fE5Wy0|7}XASneTrGTUqkd%7RbQkvT#&#dJFJhyltPncjiJid( zC@B#`*t@V#;(8L-NqiX`lTxe1A4i?UpC6cH75%v3dI+tf5U9i?1p~}}_EZCu+A|0j zT;g#1hLMpCwVs7@@{R)&pDTCI>n6}65XT5Irk7j*?iK2yp8C8o)-o}R+Q+O`@IqV$7m zy}7+q)7Y3@CpMzH%hA<+{XAT-v|cKA^>??9mD@n`m=2IHQFIm%r|nZl0yYEdX#g;b zS@1k$^>0!fZ3=vlT*QM1$#Q*=S$<@pIbgs%LT`*UB9u_Dl=Mez!TYc5=^6jVH!k{# z{O&}{*tOS=N!!Fhwhz|5$O{2WRVt+qs;u9vNTE=sm?xuo zmu5UABe>;EkVB?kYMOi9;QHa~SiAkD`ZcWgHT9C}ClxdX+rbF|LtaVTQ_!GSCTz7> ztyf-n_xM}CZ|vW8@a@JZnYj(?ot~7J0yi0GP`%=1dqp2=StbTh`##jx!blcPMQ9$($)fhDzTXTV9gil`VhLI@=VN-cF126IJYoF z+8~!FKRKLkhy_JAZW9X`Q=0^p02`Wa{6KM-l%(j!!ht!oSR^Tns6&#ix-11;>5}ro zV-n8$pOJ11Et};p0GW$gf)?OfI@?i41F*A>l<*$iqqT;jd5Mx)uRL|#x>MP{HSu$~Lw-xuo9m^S7b(-KmxSD+ zmPO4qxYs#1)@rfmiZ9gQILY3Yx0G zHv48aHx*hACa3}L!vk2vsQQti<+}&+9qazJeD|Q6dLV>6knbMIcMs&d2lCwm`R>6; z*n^R<2lCwm`R;*y_bB;Z0!?yM!x1jqvI)mcIOcGrh3!dOF$+&nnu8We$YDse{yN3B z9`7C^(G&3!#xcEDI-}WgHp-Fi_7VJIg=!&Yx9xmA_|&|v_PL8Y$dK2Z#Gclc zr&0SfYM(~!)2MwKwNIn=Y1BTgYR_6OQX{~ISOm=OgXq*pdJI^7NZB>2;67Do09DvE zs<3NRVb`d_u2F?uqYAr56?Tm(>>5?rHL9>{RFS!|YgA#^r~<@&5H41}i%{kWG20A# zJ25*?Ne2$tsSt7iutx3KC1R?%*##V^I5k5u5HeRkwB6=vy~WwmDHqE@iD|O_hRxZ4 zvIs+iQL6?GB{88px`MJ+#Tbl3u(?HC4jL^^%r5pVmVNbF-RY7K)w^t^WxccEb+M>- zFz(z|w4qDHJ*n>1J#nYLx?>RrSArJij!ZF<2i&QLDCt&(b-dEM}t zZ+p?no$D@KbjFKT72i?AO5sB7>_QGH+8^#T5)miBalFt7*ki#4u-Vab8Rvq%zEW$c zxoWY7tznb5TpW8@?7ZD?y?JNvwbvT^C#v#!#3gx`ybAe*F$2;hPJ?!bOsKK?(B>{Q zDxAnL>Td>0Ioc=xj-o%%sNuu4I$J3Ql3=SKWQW@4%}(jUK9AQS!?lUSRO;GgB$lvD zAhxNa2R5&*HqUO}xZ!={i}Qs_y&KA0u3+q6HgxKv0BUCFrcLNLG7drD9IyTxR%DXFwUvTl1M6qKBr_njY4riudBu0 zD`B4E=p}Nf{=pHuf?Zxf&1p*cq+%r}TC{zA%O0P1rvyCE3hZQ>B(gmUv_h5*V+k9AEj$aasGQ zykTtOM^=7Tn^rj9&rDTbj|VA9NsZh`fF;@?d0b-a|}Q2&GXkZkcFBJ;>U03UvFA=(3A5TpR$^P@peYP(P~8zo|^*^oA5Wc6L!*KA+E?XEA& z-=T4znDEN~nuq`>6Ta(l=pk<-JQQ$*z&N1MCIJb#1T|+Lp|POQ_Bm54Ga-R~rui|; z1>=a+_ME%tlIL9_|2*LUI?t4EqeY0k>bYYR(tH#23!arA-=uVkV6&sfNz~kGDYgm4 zK3gnBOz3tX7ogI@VKt~gOCpG%S|l|kdcMSt-!nemlg;N9=RAGW=)|AEi++=@@2KY$ zKK?_#7&0ae9S1GJv1|!j3(B&1cL~Sr;g*~v53l2#J-wCi1VN2?#g#~v)ENPf9*;z5 z@KA=}dJ9#NdT;6wgIbA$*@QiSRU6G+zDPYevKdxvJ-9XEJNrI}Lx*XYr=+J9h;&xLp7t|S z`_+8LhnfYEJ271Zt#Tj7zNo0J(rMGS8&aLZzg7g2scGRagNEHEtM&T$J2$Ug*;cZ< zA5r4p<&WkQCfp27xEY#oGc@65Xu{3VgqxuWH$xL{h9=ys zG~s6Cm;`>DzyP~B&n*iY+d8B*;SiLj5U3;sO*jNiI0Q{N1Wh;uO*jNiI0Q{N1Wh;u zO*jNiIAm$UA!x!OfC#ve8}Us`EGc|8!K%3=EptvyT_C=_NX`O1xkSm5^`LHQp4QM;4|ze| z&==6?HLu)w+4yDXPY3TYMit+!P5x2YS|YSKM^R6T0nRUmQE%#R`QVP;8`smO$=G32q%>F2v-xlDXz2 z|7|syZ@qK)!hznM{qwgC-zG1gxETO{$7ntHpaJQwazc6X%_z?Y38niOO>UHv4wPj_ zuco<(CMA6YeHHT22b&*@k#}D9qUUct{el-=cIgJ{%&fw@V<*Wq_%eG zzMy0r=g=(ubmklhO{`rXTewER*p>xJCxZG44gZZ+In)vIxNqnc~cv_)DyysfB# z#A+?B+M9=O9^JZi6wUIbZ+wHriph7%#}TdQ(D}tgB~g)&Px!s-_)Nk0p?Ju)!F+}i zTJ?cct>yNW8+O??Tz)ygz||Au!V}}d6XQbk-4o+N@QNenm$fW8F)p;^6S*=Z$cb^G z($r%o#)T)wg(t>^C&q;*#)T)wg_i%79*aGT<3fyS#P2XptE+LPgkCdLI3)C_IMCyx!J7MYISlnyQ$T=|PRpk%bIL!%Let(MQMoxwzYEiV5&j;i6rb;-H zP4zVO=dEM8CRa_kW2soC+}B%Cd(<%oyW1tOyLE~8XumSrr|DNF4`{Q9Whv)anzM%V z_@Ir4o^ZTZ#-4KyRqXl9EOS2_dtO&wWfinL$KMWfmeKN@OFKuuK?_Gc8jjWYG%)zC|U$cf`e!*ziwn?-S&Jon|~dC z+;8U{K8Mz&1#m4Z)wlQe_g_S#(~8Bscz!P#fwr6i1|V$; zA$nleQ6?cyo$yHGRC%Y;k|SX^a^i9AUlD`Admy(LGLP_`5Pk z%hxqF!`IbVuXBX$S^ieiZsvs5?rQBzN~0Mkm8NGfjt)I3z>S#~KMYE4RkMJ3L|dz} z25FNGNr%&HF0?X_X_O^3&@V558auRZt80vQo~ro%>DnI+-WO?jX_+LvBr+OyI2$zW z0jzD5+5yn3u&!Xk?3JQUT0#Y0AfD(=qoL$gLP=;j8OSLM4Xu6(RI0H#(}8%qf>vR6 zy1fR(H|2=@C3?9JRy*1=L*zv>{217~2a?T=LZN}x<>p?VHS-Ktl^sfU%g5!-rj5z6 zv0;W**`egkw5sT(uTXOIAQm zG;qtecAc}VYgzB2b0*&Sol{nvB0u-k#2XGC{PUmX*pi8dWRrqX%~QaJ*DmJD<@C|f zGZhVFtZ8fMKlDrm5kyAY0VH-|&LpYu%vq8-xJticKGBWiZags;DA9h#oZ;x1Im6M3 z6}D`=qtA4}EfOzupd}9T3^kV&9X{g`gVPUM>$npimv(lYd*+Ta^-S7v=Rf2n0|VOD zN*RBW_=vFs%z%AQ+kEGA=V0oO*{)o;aQnc3v18(iiJ!}?#FUAF8607Bf<_~liCe8_ zcR2GwOO*{+p})N~mx=jHG8yfS!4=EIhc&xG7Zxt>AdkzEA}PCI!!VsyDv5T(T3I4@ z(_7qv>^XHX&DFJEC&dl7+jc&UKl6u{%s`jKgcx8S z;B<}_WE2CI5cAMKf^!JkCxn!sTb!&yLChXN9GNUAbKTbK@NWb@@PSPeF8L?&#p!Zl z;@l(4(PBqeAb@OHk%(2UADz@j5gbX18w>&U!p$jjE>!0d)Aj(&M=SEupA%P(KBfOT?lJ%jDg zHGRvmqW*)=ysnQ+^4XDAW1&9xT<5nMTuQI=e;uIXnD70iD+E{kzb+Yc9Jz?l(DU!6Ts!suvRu=1{`AW4 z{Ku1Vm;DW8Tnux~w%A9oOn2eJe=HfN=BPod9>`RFGtE*A{pRRW&sIa6ppSadN2h14 z`?VfnOUds!hc)oO=KkW)& z8#*69@@nOKqOxTeY9$z8^mp>kfpjHSkN_)n2ZEby4}mDRR{HLukm**&;U z{glhnsPfaNlzZjjPv2+?40<-ue$wA5=@)$Xns&=Im<9xRE#9?YU|_-4g^SeUH07JJ zXyMjotX!9Qu3tr1KZ6Wpy(_?p|A5x3DmZVW=EJx+8V`DS#h5vi*<7qfpr{W7@giSn!g&(_r&`;h zbc0UYVU`zY>;_gh)`HSS*AQ5vY8}fx=~QUSNeR)mTrarPUPyg%;=YzXV??%OJA0RP z(!g@k8d_btmi2Y#H`V*1W7`(?p$Z67EN_5bl@ym->Wc=8ikc>5F4VwBu~1V}YmWg+ z`U)~u5Nl_-sd8w~ksr~_en6rPVNZgMz_t(tJ!mhSgn0yh0Vfx2OfuDEqbeUwhfe2%JAQ^v~{p{_~N@_f33R_M+5j`=U$K*dE$Dmy}BACHBf|R&{98 z;+Vi-6jn#t9Vgy+<-{A==W3H5m)k)WPDT;-H>5s3#8UiGzCLpq@CWCl2a~gL>i?^~6CvaYa2gpf3)bsxfRAyzRQEMl=3I z7mScy@V4uMw_O*!?YiJ?*9C98E_mB@!P~A2-gaH^w(EkoT^GFVx|FwF7oeL-gFL6o z$-Y4H%Ao;@c($S_mUU^t-4@)Xp>GzB*>iZ@hhwhFV-5>(ywJ>HIVpP9RL|Dy$SewO z!o#!aHI816&VGo+(28Aw<#gscJMCb{=oN@SkQ&7E+KsbTXk8CmA^h$7m4jWaR+x3j zg&nnQrqGnlEWkZm}A$cjOC5 z5#zIrGh+>!W`onjh5DMTeH&T&6eG9c+iy=A zUja>(L<146{eciniJS+bL}Q`5++n_+~`w;=TmA%Kf2hL9~4?H@zmr zTt!&0f|)QLg|ZwsA7*#!2ZNir+(`al-u(IVxUEbeP9wL8YkSYUZq=&m&g`}JE8A9` zH!yJCsy1scd*%%+UOe!*g-ez!Y-&Sn!0cBL*)hAYZTO|zdV9CMblBQ2-m$j5eeI6L z=AK@SMPTeP#6QWQZXMzV+9}CZ=$@;GTU2zc)%_{77fp5SHS|9v=iyozQcfLvUhgE{ z^xO;0Y2U89TgLGR>L~4xS z(VGJKSwTF4wnQ;e?%+luIIMfA2JdRq~_t*Cn25)i?BaO;JDaR~@uA1Z;> z6pC-t_BnJw4~ zoc7wIdY{+gR@bxkM|Qy#h7F$%&1Tm;f1t0Ykg_@NE+sOvD8|A}77bbOnC_k)l7!N>jJ<9_gQ zKlr#GeB2K{?gt-7+(o_C(+@uG2RNFeWZ2FjCEssf9hz_$-U6fg4UdKo!fa zbk!;QRpU1|-Z+eZdBgBcHw`0Hp~Ux=4e^xmIS9aaLl*(o|Gu$AC|NB|O&R|e#T7X$ z!iE`F1ZxEb?H`FnBC%yX_$4d#Qq+F^m*SuA)>uQ2<5QhEGSKPP9^OCll|&|>VN+|_l)RR3ytwL@ubW~2}^w84~| zIeKJ~-uEX{>0CTHg@|rUf8)1|7v!tT>BUJzj6xLPe2USud?&|!bE-8SHqAoJ-y-l) zhJW_=Fy_}j+}dXxk_EwkzPD?5rRAS3@wHv7wa54*sD0e^kXv_gJ-|Sphd@?DMdZ!t zcBl!an2ue54+M{`>sx0mUOuwnLrabK9o!&SZCj1iO3b2F&O*F^e+CTC#7A!1DgRlo z{coBaMsT?xdh}^rO;4$!bvF9kbE1JOn%FHkGr<9oH74Y}G-2hO9!F0BH8$4s@qC%{ z@(#2G26)ttdVA>YkYGp~wFLcATi=+v*6X}9*;iOCan?+X) zoC2#6giz5`I=I-HOV_6Hp>&}Tq$w9@DQOx~D#|Qen2+rgY+JDH!1e-cH(|RA+q<#d zhwY2lC`}o(hrF&1#1NC@cf1CEcPQ3cfVCU|V|V2Ifkm>kw9u7?*XrbSQ$2w=I(qad z#pS0Fwn;?|e8m*AJCy5BbtB+U4j)AXl)IG(z(}b{(HLbw0|Tq2vM@dG&VV|^D1#!i z3gqpFO9S%x<4FR>V_YZ(R68`Fjqqr%7{FT`(J#b)G3aoKd1oI&Va$96qx-#LF3>!n zXplmRaU|v|u(Twhu1@Vz6E2wnr=pK1S@aX#D4tW;4OCB0a?i(mi*R)w_8O>~X&J&d z!__lrDJy!_Unr9}2XrXSA6H6+*{WZ(y1`!{wB)IWb`bC&_;WEf0As8ClGZaaJDS5v z*n{YuxRk_J$JU2!1-8xD&c}8Iwi~hCf$g2xK8EcJ*i6mO1IAC=ILO6W%=^rI5`Q3?I1gnm>)KPsUgm5?RXMr5Gqfzx#C5TvFmnxKkv zs&h>^rumWDMGJX(SZSF1(BiaVY9{Yz4^lza4)guefm^yLvHtrQQCf_O8Kz}PI}MRK zOv~({nPFO#Hh?%C&CJ?eJllmle4~#^8cL zP2+fZ2cc@S`HsxnMzv&S-g}^;94GI{)EYz!ZolbIsPop{I|#jbM#Pa8J$*Z~m|OHz zu2s^T^o*`mk5d(ns^BJi-jxkG6IUgrUs(0g4IV`M%_y_~=&nRFVxPQjh9}WXuObVk zpB?F3WH<3VWVT^coCmQ5;J5~z;)|wX3Oe$*Fw{~n8db+2VjKaQL8vRm$&Y5%hw6wL0mHwU$V}5fXMrv4dd9_q^(6|{q^L>xH6E1>5U(DMrDc?I;m0(xEnJ+FYCS3u7zC<#WrUII)`8&Tb+ft;e= z;_j@56W6F~5hE@fGn|AM0t4T{0SD(3DLs-*DbZVp`0c~C0^4S6=VQA9+l|=n!1hjT zAH((qY$iWRfuE#Mk;8BrG>wv)F89IfmOi3~&`8TM2ADH(dun&B*3GR4AJE}PbfOlb zf2*%|*Ysuj1=G_{7_H!&Aqb%5mW53>Bx^5F-!NB_GI}Xn-16(u>h|j^Vuf3X&*A39q$H89w&2L>k%O|3ytQ)efym^o5d?%FbZlrTGI z4xjGCH!Rc`LdQMW2;S=h-WSpPh0{BrRDdU-IfQUdXIQk1)gsm`u;uq+`9LyO4O&CR zzv%~Ko{E8!1Xs4=;QZNIgUfge$0?VgC=M$Z%Asng`y8a^!E2zHAXB8S1p*teXNo&wNI4rzh+sA7=D=Jnk6PtCk$TY1q;f%aFu?TB1m zptPx685nqcd_P)pDpzCj0lfS>m8Xh;i%~FMK=%TCDzcvipN{4^Hj9rxG8I4u~)CNVnnMoqsx~RJ;7s*Mq+aXwPwIN zLUygSsmYA5H8i9mY{~AevfB!>_0_FkHKS}9(3XU}-gYX0tcY{9M#=$k6@|>4k0TQ3 z2#u&!7zp73ni45iIWX5ze8{?`n&Kpn(noj}FS3e7YyoPpQ>!*(M^%7yjGxnvq58~> z{c|+uYMYJ)1e(;glr7I}OChBc4p8gRvM8W>!<1FUiXENDfSZl^m&A}}A3QRS^d0Du zZ>9EqL@a6JJ>RpyWVA_U7*n>jjny~8@(EV1|gRNoJjx|#8g{{^on7$plH8i=FsEsIF7lXtf z8QD9gmHZe|pZhtZc<%XS=7Lt%Z? zw+4990O48nngd()bW3R?bqT%Zc=bB^nuH^(DHk52Qyrt?S06dNfTYnl7&7};jb2Rr zP!)l;9B!Ow9MjW*b;T&7IMvpqPcC>O2AVn2wQ4>+OH1jlJ#orF7Y%@wXKGoKD<4_s zJ!I0ysNWk*$1e#R!KdYUi0|ry2B5hb2MJU5+Zmz%zp%4+C;l(&-MOO|R%vyDbVo0F zG;s5M#HRmGjNJ>cN|@2B$SCWmgvCuOIHn%KaX;;pJWn0KhUcic)^N;G5be9L1yGB{ zfDANJG{>7?^xZ*RB=Fh@Y79=xSZDNBV=cm{#o>{WsH4YlJ%-98VB*kv2WL@L1T+do`j6|F zN%UCKs(RF8l(yu_|m3qqbH6&;S< zm@=5@N!SE+vLkA+SSp|P=}K7M?ML9cs#qkV#3_0hQuL4^XOMuDoWWWK=|Z6l|E}xj z1!ss))rEMDp+6Af+|eM`G3E7$EqMSBXp zJ?*f{Ooy>;9q-|IbvlONy3tLTmixHjHbV#^C#?T6IA`B3PLto~_>)Q~XCIo?egF`NW6FLl7a)B*ca z2kc87urGDMzSIHxQU~ly9m>A63^2|`OU%_4s}bZlV&yo397mAj2yz@jjw8r%1UZf% z#}VW>f*ePX;|OvbL5?FT#}VY%gB+<@bl`X;j#uKCC2gU+Jbq+7Jxb`pOK!Z-z@8Sm zdDxSgoP<3ma8ALV3cgy`afr8|^{K1F*QGW8MNb`f*_ym!%28Ii7m@;Jd@1Xhqxq@u ze#c$!Mj3p3JM#$}_B4)8*sxF7u>Vikugh?%9K5E;|V+VA>rar*s-1bEB zDBrQa?grk>nL3(p^v7@b{aLPTfb9yFbk1?6;K=c31OWN*#5uQbfGZFAa^mVe8>P0t!--&W2yuwHSJfH2`Zg=(KfuV5fQ+PC!) zELyZf9BSN#$-6&xsC^qBpqOdi&eXX!x*jBPiiZF``|tCmh7(nwUO$s{*iT9UQuZ6 z9#7<>egv)H+%NqGpY88lkscU(g#H-#GSA=qTkyBAt-1XL--0JTp2ctLNyhJeHoprO zJ2%Z~*g@hv}m8xgLacZ}n!k?Mny8n*w9?^-f|0ORy2 zKUTML-_+Ld5cr1!_*L=pw6~u2D1M;pO3P25!Ep&IznC|}%asyOwRwe14A?xKpO}QHZ4`h3?Ua-M)9-v?lKX%4J65fe z_sUNwnuLQB(M~4vc>dt0t6W)yrCw&+pu_pVNJV zlP_uPIWDA+TnKyR5tdgzHT0~|E2xPe7d=OnQ{U9;Xu7@5oTgsH2-r_5_xnTS^__Pb zIeJ~L9%3LSIy9ZW>C7?4u)1|@h8&|025`sN1Y9daX=_2B0@NJY(({`>#VQs67oQS$ z0TXwIdD4<(Bc>Oe;U4QemzwaUa1l~Se@5i1=NG+X@{hpLY*+__~_wktP zy{DjcO*vJSL3!xPe1QFfvzQ9TMF_I17p@=vJ?LBRyz|H&g1OCG*&oJ^_#pH@B+P0d zfOJl+9XM64q}#<5;i@yzQ0)*NLWz_VTciEoU;j;`bdgEc96 zp}fK4Mf;&4(E1ny?YKTme?g3G%D)rebp89{`|tf-@V|F?7%%k*HLEzg1Tr)t8 zlCFz(NJ1{`=7^CTo!TS4M7ihef|n7&IiyhPG#`Wpt%eNLXlH1(2;gaIXfk#+zgVyI zG^OgwbrbhOkUuHirjBbWy=WCx&*w61@^-W**D@}h4h?DmHx8^J#q^3AIs-#onWy7Q z>G3sd#^siDeAY+MCuV%hp03PO-?QghphLfDuT~jq8hEzLzX7qy5XnKnLdfWwBm-L2 zj%I1Vw@)--(Vv?b(O)YDE)*t?W@+Hun6@@_JvMD`kP8^+Y3D%Ff|SH&9CM0b~?tNZ$?caEN2FO|Fc zyIaS~ZE9SBF|9EheJO?IIqk#>zd6q6Ivv0Ybxrmxj&#_A7+Z)Q=3I2cwetz=tua~~ zu5$#0?|XBIiP54Oef9Lg%y_7uIYy3V-?HqGkzbe&=jKj-yZ&3Mx4md|)2BC$wzjI> zi;OuFAIR6gTFadVVYmb9^e3jh`_C~Ri0#?Y95^2{w4PuMQns>a7d zFc0tx-gtlVUW2v)ta<0!e!a4qdUZsp&H7!Y9AvlR^(`0A-#xKFzt224*4AS*BZ_=D z&dxA;DMRjaq@6`xM;~dcxz?GZYzwK!8g0{{b;yYOd*kCr47zFfKtCmN-U4_yb_Jj0 z*!A%B1LTujD8cbR$NscGa|Eu&uwjm|)hsY)UO}Jcic&_0YM0aN1-5SeVuR#&_r(o1 znK3$MGDbOKE*MbX9G7PTmYC?~idXHCNxKf|i6vsqv?ewheY~(YapeTX49eAOPx{dW zwMY<4m9UEG>Jp-u8RO%@LS$qEy4qv)Vy+^SFhmC&w$nFBeC1o&_*UDvR6J!#FI9$~ ztukd6zd8YX(T8`#`nK*P7Cp)Tm-nCt$Sc-}Jpg0b;iV=WyGHrJSRhKng9IB~vw-NC0< zuC3VFC-Gf#;OFhn0)EaqjE??t{2)dr@N++8XA<5QjQsQ0Vh9V2dRHG6OS16TQ4lp1 z8}wNzSIGo(zGk(y4^V0JgA6P?G;J}oLvz(T_f~hN+#ydR5tE>m&45Cbwp!Twl^}}X zi!yJ#99rcSyG!yp(mL`5-bgf^giUyB-y{cyi z{huPrl}O8HNQYvNG;YF3KJIoooGuB*{pEVmg3SbYKbg7&lBV(0DoR|ir$6IHrl{azpfD~1Zao%E z7PgKKkJ(&P(3}rw&NrdCaJ_E3(=1r*l%vL*!LK-OC`@aK>=7M+$kLs;7E$#CN;_*7 ziBlM)o&dNh>!s(782^DslApVT&0s=QpEeDk?`F8TedFOhp5 zlY;{TgWT37;_(Ex>BtZ358knU{d!qgH8Qel&gymRRy!;Cd}U!Jm#a`V0f_&(zl0vk zSZgz%?RkN#&^BR^a+5d>7Hc4zE3JKy_%5((AJB}eXeZ9{SrO)PIHrePoofbTre~cn zqYLEGF{t;su+QsO(vugiqSU%yWLo*NVGXHL=W7paUR!OR-Mn$b`^FdN3zd3zd#RQy zK&u+b^sR_Q*3O$hf{2w9*M7U$vZ%XB7VayzwbZMi1kjgUjXF4vqNmNYElkgmK38-d z4g3FJ=W4Baz30w&R=3CB*Ox%^f@jmN!2a|1@MU;*$2YodpX+`s^j+|YQ?=?s*X5Zy zBj=WE;Jln$;);FlIrQQXaB6OeFKK;|J{OE0FjH@&Zv*s3IyX!_C_6CT?SNdx_c)(} zzD|EzAC766>w|&{>k6eD=i;e}AI+D6nz-^>W<+nxmqCxfp?6G8$JZjMDG~N1nlYy1 z9;m7K2@I*nrtBCN&npRx3(6?{Iq75gxAAxR`;Cch&@BJ)?U4VN{z1>0ZSFZ>vwbev zNR=PWbIN{9y@F$$6MkdUGc6PlDlEw}`HlU<_#GKoiTi)wA3ZL9C2uso2ixUrAz}$S zy!X3W`cu|=F^p?nDHp%ng@9-}oStQNINR%!t5>gz#v;*Gt5^AaNJ8;caMkKpPZ=Ms zlf~I{T5EjF;lTY`>zuaAs@131aq_BZ^8?1ZwaG#GYxxxHY@)f=t0psAXab28VOE1x z8Ix4M9&bOp9w`LJ$BkkpFtDg|JbY#%VRKCU9y;HzDmhm;8#Y7r^F1 zOH~%S4!<76@jE~LFw?xoX*(y>O=V|?(nOON)l&u$qcMP=yWu^W!1ydJ-ZaT^ijUWe zh^EDO&i%FihT0mg2EIq%aMjdSv*GIZmnOC*y4}#P+;byaBTKP0+>IEv#MY*zv8DIl zfB*2uhu?}HcK6HV$59XPnVH{JojHR?aH$Z}>y`8PoE%aXR@#{OT~+;^OTg6v9J=_) zwLbM-)z=@CO%o59pH*cU^0yMU2w3!8z}Iw)59LmajA`n0GFljFgF4k(cZOGAh0WOi zzypk9YyIw*qw-hsX`{y&H{NSJVvE{3Y%6SAZEvxC#lFh^pd;(p>G+}JN#~8ur(AW{ zR@W7-+gFdANq8*$g-AAXM&#v@d!zQ~vgjGn+oShKe;VtF z?T&pc_GEl>{0oU|5^qU-FY#n@PI6mvPx4=qzfIXwL#Zp$?)2RBw)D%>4`=3O&dTi0 zyd<+f8_YhD3+B$seIy^xugu?(|4`wD#qGuGiU&$Ysi*XE{Ov1O%b%$fE6b`2s=I0{ zYhS88))a1PYtAjSf{XgjOj-QL$e*8aNo zUv(_$cxv{-*4E;>Rw2W%~JKE3;+R)m~wNI|SbTxN%{%U;ng=^y4xoaQ3 z_R@NJ{Uht2xjt~ceEr=Bx^I`8s2b*H79R$dxMnw-!gnB|H&XacT%9ea@G;PQAcgP3 z-};_U;k$8F@7GiK9z3Do_fz;@;Qu{^?-Q?)cck!f@h17rDSSdaBo|ZIJN~c?Quw5J z=>G3dVSEqY{m&uK_yUz%ZRc)=CTMCFTs@G^F1E?h#{9cCgpt%%>X% zpfPqTj_nks9`|~BdV2AjzEQ3|?CIUu*wc82f`Hy0i_@QO9sy$9)Qt_pbYp`dionSK=V31@%Oo@w}BSWP2$pwlqR#el@80RpmRX%^=wcg1Xv` zTAE=1hAlAcRz9E!ouX=mIf|t^zl*W3UQto3!g@3DQP*(PMy1M8J?Uzm>DCOj7?nh7 zGfMsdf^?wI*v%LJghHIpukUoLYx2HJ`FTNdhv(TMQ=2mO`OF0!ohZJ65|;q4icr52>KYsY^;h9B%tbxE(0tRP0=EgmzK7C^>H^r&in&`7w4iyIF$t73`9B z&FQjY)emb}X6(9^5W8-=r7{4VJ96G|PEE{QxiC9EGdH=cOswlbfo_dB+73(5z$}U? zBPkeeHXzy~wn76DEIWP-e>{q3h(oMG6vwTG)&iQFNr}&qW>ij~ zZP4xEfCI=1gr=Qnd2bo*bSgDlR#0>p`U&R)Ts_X9;|kDYE15<~(mYKr~=2eAwR9;=s9HY3j;Qj9S$aFDJ*HOZnbO~fpXr| z_>$)>ZKw-=UCm?*${6$8D-0s3)G8)VdgB{vJ!p38;#BnOk9L}kfbkV-2TBAMcRK_p ztmQe%?J4`k;FerUQJsb8bQ%xqKcPlj#3%?558cpqtWne29tAa8$6Ee|t05ph*mELwKl; z*#%gb*RO28wd0@_8AZFTp|;%zuLPWZ_$&}LZRZW(BAkxi-io~Zs=YkL|6PVqGz>43|L)YplecqcO*Z{@~2sLv-!)4ofkZjOL)! z&Qged9G3LxS8w{+13e9fknsa`wK$92bC^z4#sbbdNS7U3j_te+&eF7xSScHAx)_}0 zW7Z_I{nk+Cf9to5-eT;UnGuV%boThD^&sBR*crsM!$-~Z;P-ZWZ8UbmwNvit^~$I= zAm7Y2I6HEX&Qi70TAB8fGpUx9`l zOaMGF?1C!52YA&qmVMP3&2dF{PwZ<-*td%4UNVYo&#z)u1-l$ODZc}+O^he#xhR4C z20ODBKCOntQo~lNVYlXEa1(92D7|3!QLe6s4vD=U=Y`-=0UT)ydDH}d>coD{jCJOv z(4DXkO5n97?51?9VP*}rjW9x6_)ZIqhNj=Nwj>yj;U)Ua^gSFgzB=q@_Mlulc3=uC zZ2ZEG!P-S>83(JW(V1&WO*pR7&VuU`0}kDK7%l6dtD}0G{^KCk4n|{i#?+eKiUKXI zW%tZ(wF0g==-Ky*^)y~9f=8e^)1DCip=a4;(@TsA>pw=xCh#FJq&4f=zWenU>1~o6~IqacBc!AuGTL0UXIe1H%HRw#4WyG7wx{~%{qK`~3&rISu z3w0q4_2hXG&mgEBv$p~sJhvj2H0=LPq%|T{!?u>q zPfBZ#RCCT{A|i_-lWR6p==UM*gB6#Dc8sx3Yk019@XXS1{hv9PJecP;%8J_0%np;y z=3JM)HRrn7c`x&ZR*{P9#*h&+xrn*_} z%ns7-6I0F1IK34if{Yy6%evr+qjYADnXI=fWU4=R6hDpLY#nF`?O+Dk`nKPDl-~pm zcP7TawSco&ub3CM;xT*ZA6Bab@=SaipSMfm9%tt?K~)B|@hx-C(_9$mMmMupFs}|v zJg7G-KWm@$Ep4KvypB@F%WyGQJ*WdSiDOkg%V^53f&Qj-yeeRKViURT`*!E`-9hBD zci=m9=B}_`lF0?{Dvl z0z2ULDoS6I@2MlA`&24x1vZ)(XHUTTYS*0{XoJ=DaBgLF)YKy85?@oOHh5AQUQ4>G zy`ZgBs6e*Iv%YJuWAw1uGY)nqrY4o()go+q5`4!s-*sr*)c#%9KIeS;^U>RuZL*4z zP2ZuAZKg9(x&|7ZOkSSDnv*_37gYuoW9q-J3nQZrE@p>64Gr4s?CtP1UH&3?uqS4x z%PWD59O_AJO&#sgkzlVp+0LG;!(ET|(3S)qeKjxg%Vd{y6tM@Qg|=rmt4qqGDsI;+ zhxR@9-m^z)eJVfQom*@q7J`#mw2zdTl|ptkoc;FW@ey4~vh8{}eBYuZf=%zl?`3{;~KK zZ2Cp}mx_;c|ONVmThpAmm4eiZ@pZ@A~`bKou> za(ouyaRcd4MJW9Y!sTrUFE-F@@wZWY{!x67csqjUd&T!5pkEL_i|5e4L;QgFLGcyw zFX9vOUU{E9F7KBoq=!d2f0KMbzDB+lPuzV_J|tf!zeT=Yeye;~ew%y*|C{*+`5jWp zN98H`o$|E&F8P>zTz1Jb@~r%B*)4nUoZnuVmj&4;`{jTfltXe@j>u6tCZCXR#8*MT zSw1Px$#HpJUXT-VQclT>a$3&FOY*Xum2+}lF33f>B$wqCxguBPn!JkpA=l+~`4;(< ze5-s~Zpde(FE?dTmhjBvviM!`lek9{&ylz*S8r9T$0l2GbWf`u=JVtE^mF3wnqQ2g z`bqrZJd8@X*#Uoz4@&p>wQi z`!at0magB;?RRnq+}r^-I*{p{$#7hTomK;Ow2*hWK}R=e`4#e3mqOm@H)wJBK`X70 zcYYbP5dLA^YCmY_!mAEv?I`3kE*6&`a$5D-(R`ofobR{V=Lan3{D6}-;OGXNrUQ=O zpwnQ~ap`k%`z&1{Z+(#OcNz@Z8HIx5GGsL|3JoCZTqgCWOd$Z;9AGV;S#m;A8RB|q$ZFzh%FJI=$7^RVMQ>^P4&&Lh?@`4J~$ u#K{ST-#i~j +#include +#include + +struct tPos { + int tx; + int ty; +}; + +struct Button +{ + int x; + int y; + + int w; + int h; + + std::function click; + + std::string s_text; + + double sx; + double sy; + + std::string s_texture; + tPos usualState; + tPos selectedState; + tPos pressedState; + + std::string s_font; + sf::Color textColor; + + std::string s_clickSound; + + sf::Sprite button; + sf::Text text; + sf::Sound clickSound; + + bool selected = false; + bool pressed = false; + bool checkBox = false; + + void select(); + void unSelect(); + void press(); + + void init(); +}; + + +#endif //MINECRAFT_3DZAVR_BUTTON_H diff --git a/engine/gui/Window.cpp b/engine/gui/Window.cpp new file mode 100755 index 0000000..6d1925b --- /dev/null +++ b/engine/gui/Window.cpp @@ -0,0 +1,53 @@ +// +// Created by Иван Ильин on 26.03.2021. +// + +#include "Window.h" + +#include +#include "ResourceManager.h" + +void Window::addButton(int x, int y, int w, int h, std::function click, const std::string &text, double sx, double sy, + const std::string &texture, tPos usualState, tPos selectedState, tPos pressedState, + const std::string& font, sf::Color textColor, const std::string& clickSound) { + buttons.push_back(Button{x, y, w, h, std::move(click), text, sx, sy, texture, usualState, selectedState, pressedState, font, textColor, clickSound}); + buttons.back().init(); +} + +void Window::update(const std::shared_ptr& screen) { + + screen->title(s_name); + screen->window.draw(back); + + Point4D mousePos = screen->getMousePosition(); + Point4D dMousePos = mousePos - prevMousePosition; + back.setPosition(back.getPosition() - sf::Vector2f(dMousePos.x()/30, dMousePos.y()/30)); + bool isPressed = screen->isButtonTapped(sf::Mouse::Left); + + for(auto& button : buttons) { + if( mousePos.x() > button.x - button.w*button.sx/2 && mousePos.y() > button.y - button.h*button.sy/2 && + mousePos.x() < button.x + button.w*button.sx/2 && mousePos.y() < button.y + button.h*button.sy/2) { + button.select(); + if(isPressed) + button.press(); + } else { + button.unSelect(); + } + + if(screen->isOpen()) { + screen->window.draw(button.button); + screen->window.draw(button.text); + } + } + + prevMousePosition = mousePos; +} + +void Window::setBackgroundTexture(const std::string &texture, double sx, double sy, int w, int h) { + s_backTexture = texture; + std::shared_ptr t = ResourceManager::loadTexture(s_backTexture); + t->setRepeated(true); + back = sf::Sprite(*t, sf::IntRect(0, 0, w + w/30.0, h + h/30.0)); + back.scale(sx, sy); + back.setPosition(sf::Vector2f(-w/30.0, -h/30.0)); +} diff --git a/engine/gui/Window.h b/engine/gui/Window.h new file mode 100755 index 0000000..8630d11 --- /dev/null +++ b/engine/gui/Window.h @@ -0,0 +1,41 @@ +// +// Created by Иван Ильин on 26.03.2021. +// + +#ifndef ENGINE_WINDOW_H +#define ENGINE_WINDOW_H + +#include +#include + +#include "Button.h" +#include "Screen.h" + +class Window { +private: + std::string s_name; + std::string s_backTexture; + std::vector