diff options
author | Aki <please@ignore.pl> | 2022-05-03 20:47:59 +0200 |
---|---|---|
committer | Aki <please@ignore.pl> | 2022-05-03 20:47:59 +0200 |
commit | 313b7a531106c623a28883db515f245a74a5fafb (patch) | |
tree | c839eb081a45310cf30d44849bf85097797f944e | |
parent | c610c4b94eda867a3f0b083038502dccb8116170 (diff) | |
download | derelict-313b7a531106c623a28883db515f245a74a5fafb.zip derelict-313b7a531106c623a28883db515f245a74a5fafb.tar.gz derelict-313b7a531106c623a28883db515f245a74a5fafb.tar.bz2 |
Moved view functionality into own class
-rw-r--r-- | CMakeLists.txt | 1 | ||||
-rw-r--r-- | ExampleSource.cpp | 40 | ||||
-rw-r--r-- | ExampleSource.h | 5 | ||||
-rw-r--r-- | Source.h | 2 | ||||
-rw-r--r-- | View.cpp | 74 | ||||
-rw-r--r-- | View.h | 27 | ||||
-rw-r--r-- | main.cpp | 66 |
7 files changed, 129 insertions, 86 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index b0e7a6b..b93c6f8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,5 +8,6 @@ add_executable( ${PROJECT_NAME} ExampleSource.cpp main.cpp + View.cpp ) target_link_libraries(${PROJECT_NAME} raylib) diff --git a/ExampleSource.cpp b/ExampleSource.cpp index e79e7ad..fa022e9 100644 --- a/ExampleSource.cpp +++ b/ExampleSource.cpp @@ -1,5 +1,6 @@ #include "ExampleSource.h" +#include <cmath> #include <utility> #include <vector> @@ -8,16 +9,13 @@ #include "Killmail.h" -constexpr int AMOUNT {1000}; constexpr float MAX {4.0f}; constexpr float MIN {-4.0f}; -constexpr float STEP {0.1f}; +constexpr float STEP {0.2f}; -static float random_position(); - - -ExampleSource::ExampleSource() +ExampleSource::ExampleSource() : + m_time {0.0f} { } @@ -26,22 +24,20 @@ std::vector<Killmail> ExampleSource::all() const { std::vector<Killmail> killmails; - killmails.reserve(AMOUNT); - for (int i = 0; i < AMOUNT; ++i) { - Killmail km; - km.position = { - random_position(), - random_position(), - random_position(), - }; - killmails.push_back(std::move(km)); + killmails.reserve(std::pow((MAX - MIN) / STEP, 2)); + m_time += GetFrameTime(); + if (m_time > 2.0f * M_PI) + m_time -= 2.0f * M_PI; + for (float z = MIN; z <= MAX; z += STEP) { + for (float x = MIN; x <= MAX; x += STEP) { + Killmail km; + km.position = { + x, + std::cos(x) + std::cos(z + m_time), + z, + }; + killmails.push_back(std::move(km)); + } } return killmails; } - - -float -random_position() -{ - return GetRandomValue(MIN / STEP, MAX / STEP) * STEP; -} diff --git a/ExampleSource.h b/ExampleSource.h index 2f45332..2086ca5 100644 --- a/ExampleSource.h +++ b/ExampleSource.h @@ -6,8 +6,11 @@ #include "Source.h" -struct ExampleSource : public Source +class ExampleSource : public Source { +public: ExampleSource(); std::vector<Killmail> all() const override; +private: + mutable float m_time; }; @@ -8,5 +8,5 @@ struct Source { virtual ~Source() = default; - virtual std::vector<Killmail> all() const = 0; + virtual std::vector<Killmail> all() const = 0; // maybe an immutable view instead of a copy? }; diff --git a/View.cpp b/View.cpp new file mode 100644 index 0000000..90bc542 --- /dev/null +++ b/View.cpp @@ -0,0 +1,74 @@ +#include "View.h" + +#include <algorithm> +#include <cmath> +#include <memory> +#include <utility> + +#include <raylib.h> + +#include "Source.h" + + +View::View(std::unique_ptr<Source> source) : + m_camera {}, + m_source {std::move(source)}, + m_projected {} +{ + m_camera.position = Vector3{10.0f, 10.0f, 10.0f}; + m_camera.target = Vector3{0.0f, 0.0f, 0.0f}; + m_camera.up = Vector3{0.0f, 1.0f, 0.0f}; + m_camera.fovy = 45; + m_camera.projection = CAMERA_PERSPECTIVE; + SetCameraMode(m_camera, CAMERA_ORBITAL); +} + + +void +View::update(const float dt) +{ + UpdateCamera(&m_camera); + const int height = GetScreenHeight(); + const int width = GetScreenWidth(); + const auto killmails = m_source->all(); + m_projected.clear(); + m_projected.reserve(killmails.size()); + for (const auto& km : killmails) { + const auto pos = GetWorldToScreen(km.position, m_camera); + const float depth = + std::sqrt( + std::pow(m_camera.position.x - km.position.x, 2) + + std::pow(m_camera.position.y - km.position.y, 2) + + std::pow(m_camera.position.z - km.position.z, 2)); + if (0 > pos.x || width < pos.x || 0 > pos.y || height < pos.y) + continue; + const auto base = GetWorldToScreen({km.position.x, 0.0f, km.position.z}, m_camera); + m_projected.push_back(Projected{pos, base, depth}); + } + std::sort(m_projected.begin(), m_projected.end(), [](auto& a, auto& b){ return a.depth > b.depth; }); +} + + +void +View::draw() const +{ + BeginDrawing(); + ClearBackground(RAYWHITE); + BeginMode3D(m_camera); + DrawGrid(12, 1.0f); + EndMode3D(); + for (const auto& point : m_projected) { + DrawLine(point.base.x, point.base.y, point.pos.x, point.pos.y, LIGHTGRAY); + DrawCircle(point.pos.x, point.pos.y, 3, RED); + } + DrawFPS(5, 5); + int y = 25; + const int height = GetScreenHeight(); + for (const auto& point : m_projected) { + DrawText(TextFormat("%5.1f x %5.1f x %5.1f", point.pos.x, point.pos.y, point.depth), 5, y, 10, DARKGRAY); + y += 10; + if (y > height) + break; + } + EndDrawing(); +} @@ -0,0 +1,27 @@ +#pragma once + +#include <memory> +#include <vector> + +#include <raylib.h> + +#include "Source.h" + + +class View +{ +public: + explicit View(std::unique_ptr<Source> source); + void update(float dt); + void draw() const; +private: + struct Projected + { + Vector2 pos; + Vector2 base; + float depth; + }; + Camera m_camera; + std::unique_ptr<Source> m_source; + std::vector<Projected> m_projected; +}; @@ -1,23 +1,9 @@ -#include <algorithm> -#include <cmath> #include <memory> -#include <vector> #include <raylib.h> #include "ExampleSource.h" -#include "Source.h" - - -constexpr int AMOUNT {2000}; - - -struct Entry -{ - Vector2 pos; - Vector2 base; - float depth; -}; +#include "View.h" int @@ -26,55 +12,11 @@ main(int argc, char* argv[]) InitWindow(800, 600, "Derelict"); SetWindowState(FLAG_WINDOW_RESIZABLE); SetTargetFPS(60); - Camera camera {}; - camera.position = Vector3{10.0, 10.0, 10.0}; - camera.target = Vector3{0.0, 0.0, 0.0}; - camera.up = Vector3{0.0, 1.0, 0.0}; - camera.fovy = 45; - camera.projection = CAMERA_PERSPECTIVE; - SetCameraMode(camera, CAMERA_ORBITAL); - std::unique_ptr<Source> source = std::make_unique<ExampleSource>(); - auto killmails = source->all(); - std::vector<Entry> projected; + View view(std::make_unique<ExampleSource>()); while (!WindowShouldClose()) { - UpdateCamera(&camera); - projected.clear(); - projected.reserve(killmails.size()); - const int height = GetScreenHeight(); - const int width = GetScreenWidth(); - for (const auto& km : killmails) { - const auto vec2 = GetWorldToScreen(km.position, camera); - const float d = - std::sqrt( - std::pow(camera.position.x - km.position.x, 2) + - std::pow(camera.position.y - km.position.y, 2) + - std::pow(camera.position.z - km.position.z, 2)); - if (0 > vec2.x || width < vec2.x || 0 > vec2.y || height < vec2.y) - continue; - projected.push_back(Entry{ - vec2, GetWorldToScreen({km.position.x, 0, km.position.z}, camera), d - }); - } - std::sort(projected.begin(), projected.end(), [](Entry& a, Entry& b){ return a.depth > b.depth; }); - BeginDrawing(); - ClearBackground(RAYWHITE); - BeginMode3D(camera); - DrawGrid(12, 1); - EndMode3D(); - DrawFPS(5, 5); - for (const auto& entry : projected) { - DrawLine(entry.base.x, entry.base.y, entry.pos.x, entry.pos.y, LIGHTGRAY); - DrawCircle(entry.pos.x, entry.pos.y, 3, RED); - } - int y = 25; - for (const auto& entry : projected) { - DrawText(TextFormat("%5.1f x %5.1f x %5.1f", entry.pos.x, entry.pos.y, entry.depth), 5, y, 10, DARKGRAY); - y += 10; - if (y > height) - break; - } - EndDrawing(); + view.update(GetFrameTime()); + view.draw(); } CloseWindow(); } |