aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLoek Le Blansch <loek@pipeframe.xyz>2024-10-22 19:55:53 +0200
committerLoek Le Blansch <loek@pipeframe.xyz>2024-10-22 19:55:53 +0200
commit3e1b0eb968d90f1ba5163b220c4e39dd7fd1e51b (patch)
tree2f9dcb8b7ac085514913a1ad114a5275978f95fd
parent99d7d1695fec28208e19b34bc754dff5dd1e5642 (diff)
finish collision checking implementation
-rw-r--r--CMakeLists.txt1
-rw-r--r--CollisionContext.cpp22
-rw-r--r--CollisionContext.h6
-rw-r--r--CycleCollisionMethodCommand.cpp9
-rw-r--r--CycleCollisionMethodCommand.h17
-rw-r--r--NaiveCollisionChecker.cpp1
-rw-r--r--NullCollisionChecker.h12
-rw-r--r--QuadTreeCollisionChecker.cpp1
-rw-r--r--ViewController.cpp3
-rw-r--r--ViewController.h2
-rw-r--r--docs/class-diag.puml4
-rw-r--r--readme.md6
12 files changed, 72 insertions, 12 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index cf2f157..d43e54a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -53,6 +53,7 @@ add_executable(main
ControlBooleanCommand.cpp
CollisionChecker.cpp
NaiveCollisionChecker.cpp
+ CycleCollisionMethodCommand.cpp
)
target_link_libraries(main
diff --git a/CollisionContext.cpp b/CollisionContext.cpp
index ec608b5..6df5d3b 100644
--- a/CollisionContext.cpp
+++ b/CollisionContext.cpp
@@ -2,7 +2,9 @@
#include "CollisionContext.h"
#include "Museum.h"
+
#include "NaiveCollisionChecker.h"
+#include "NullCollisionChecker.h"
#include "QuadTreeCollisionChecker.h"
using namespace std;
@@ -13,9 +15,25 @@ shared_ptr<CollisionChecker> CollisionContext::get_checker() {
return this->checker;
}
+shared_ptr<CollisionChecker> CollisionContext::create_checker() {
+ switch(this->checker_index) {
+ case 0: return make_shared<NullCollisionChecker>(this->museum);
+ case 1: return make_shared<QuadTreeCollisionChecker>(this->museum);
+ case 2: return make_shared<NaiveCollisionChecker>(this->museum);
+ }
+
+ this->checker_index = 0;
+ return this->create_checker();
+}
+
void CollisionContext::update() {
- this->checker = std::make_shared<QuadTreeCollisionChecker>(this->museum);
- // this->checker = std::make_shared<NaiveCollisionChecker>(this->museum);
+ for (Artist * artist : this->museum.people.get_artists())
+ artist->colliding = false;
+ this->checker = this->create_checker();
this->checker->check();
}
+void CollisionContext::cycle_method() {
+ this->checker_index++;
+}
+
diff --git a/CollisionContext.h b/CollisionContext.h
index e35c373..0dd37c0 100644
--- a/CollisionContext.h
+++ b/CollisionContext.h
@@ -1,4 +1,5 @@
#pragma once
+
#include <memory>
#include "CollisionChecker.h"
@@ -12,11 +13,16 @@ public:
void update();
std::shared_ptr<CollisionChecker> get_checker();
+ void cycle_method();
private:
Museum & museum;
private:
std::shared_ptr<CollisionChecker> checker = nullptr;
+
+private:
+ std::shared_ptr<CollisionChecker> create_checker();
+ size_t checker_index = 0;
};
diff --git a/CycleCollisionMethodCommand.cpp b/CycleCollisionMethodCommand.cpp
new file mode 100644
index 0000000..cc7b7f0
--- /dev/null
+++ b/CycleCollisionMethodCommand.cpp
@@ -0,0 +1,9 @@
+#include "CycleCollisionMethodCommand.h"
+#include "Museum.h"
+
+CycleCollisionMethodCommand::CycleCollisionMethodCommand(Museum & m) : museum(m) { }
+
+void CycleCollisionMethodCommand::execute() {
+ this->museum.collision.cycle_method();
+}
+
diff --git a/CycleCollisionMethodCommand.h b/CycleCollisionMethodCommand.h
new file mode 100644
index 0000000..1caee53
--- /dev/null
+++ b/CycleCollisionMethodCommand.h
@@ -0,0 +1,17 @@
+#pragma once
+
+#include "Command.h"
+
+class Museum;
+
+class CycleCollisionMethodCommand : public Command {
+public:
+ CycleCollisionMethodCommand(Museum & m);
+
+public:
+ virtual void execute();
+
+private:
+ Museum & museum;
+};
+
diff --git a/NaiveCollisionChecker.cpp b/NaiveCollisionChecker.cpp
index db277ab..e26c3d2 100644
--- a/NaiveCollisionChecker.cpp
+++ b/NaiveCollisionChecker.cpp
@@ -5,7 +5,6 @@
void NaiveCollisionChecker::check() {
auto artists = this->museum.people.get_artists();
- for (Artist * artist : artists) artist->colliding = false;
auto begin = artists.begin();
auto end = artists.end();
for (auto it1 = begin; it1 != end; ++it1) {
diff --git a/NullCollisionChecker.h b/NullCollisionChecker.h
new file mode 100644
index 0000000..f6b4af2
--- /dev/null
+++ b/NullCollisionChecker.h
@@ -0,0 +1,12 @@
+#pragma once
+
+#include "CollisionChecker.h"
+
+class NullCollisionChecker : public CollisionChecker {
+ using CollisionChecker::CollisionChecker;
+
+public:
+ virtual void check() {};
+
+};
+
diff --git a/QuadTreeCollisionChecker.cpp b/QuadTreeCollisionChecker.cpp
index 0d211c0..72337ee 100644
--- a/QuadTreeCollisionChecker.cpp
+++ b/QuadTreeCollisionChecker.cpp
@@ -86,7 +86,6 @@ void QuadTreeCollisionChecker::check() {
if (this->artists_size > 0) {
auto begin = this->artists.begin();
auto end = this->artists.end();
- for (Artist * artist : this->artists) artist->colliding = false;
for (auto it1 = begin; it1 != end; ++it1) {
auto it2 = it1;
++it2;
diff --git a/ViewController.cpp b/ViewController.cpp
index 7f3fdfc..989f11a 100644
--- a/ViewController.cpp
+++ b/ViewController.cpp
@@ -3,6 +3,7 @@
#include "ViewController.h"
#include "CollisionChecker.h"
#include "ControlBooleanCommand.h"
+#include "CycleCollisionMethodCommand.h"
#include "QuadTreeCollisionChecker.h"
#include "Exception.h"
#include "KeyboardCode.h"
@@ -121,7 +122,7 @@ void ViewController::ev_keydown(KeyboardCode key) {
break;
}
case KEY_C: {
- // CycleCollisionMethodCommand(this->museum).execute();
+ CycleCollisionMethodCommand(this->museum).execute();
break;
}
case KEY_Q: {
diff --git a/ViewController.h b/ViewController.h
index 4ff73c5..162ae19 100644
--- a/ViewController.h
+++ b/ViewController.h
@@ -37,7 +37,7 @@ private:
private:
bool draw_artists = true;
bool draw_pathfinding = false;
- bool draw_quadtree = false;
+ bool draw_quadtree = true;
private:
unsigned int scale = 16;
diff --git a/docs/class-diag.puml b/docs/class-diag.puml
index 58ed950..9a37256 100644
--- a/docs/class-diag.puml
+++ b/docs/class-diag.puml
@@ -388,6 +388,9 @@ rectangle Group_Commands as "Commands" <<group>> {
- value : bool
- target : bool &
}
+ class CycleCollisionMethodCommand {
+ + constructor(Museum &)
+ }
Command <|-d- ToggleMuseumPauseCommand
Command <|-u- OpenFileGUICommand
@@ -395,6 +398,7 @@ rectangle Group_Commands as "Commands" <<group>> {
Command <|-d- StepTileCommand
Command <|-d- LoadFilesCommand
Command <|-d- TimeTravelCommand
+ Command <|-u- CycleCollisionMethodCommand
}
} /' LAYOUT '/
diff --git a/readme.md b/readme.md
index 11574a0..5e5a8e4 100644
--- a/readme.md
+++ b/readme.md
@@ -12,9 +12,3 @@ ALGA:
- show {shortest,fastest,no} path toggle
- vast meer
-TODO:
-
-- low-binding factories naar high-binding factories
-- prototype met geen factory maar map ofzo fixen
-- txt file parser
-