summaryrefslogtreecommitdiff
path: root/src/Compute
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2023-08-03 02:29:44 +0200
committerMel <einebeere@gmail.com>2023-08-03 02:31:12 +0200
commit1d574e5e8fe3f08d13f1b8c4444fc4cb02cf0faf (patch)
treed151baab68d6aa444a5968a1b579c5d48025084e /src/Compute
parent15352db7bc03a176ea7a184f40a7f4e72b54b5fe (diff)
downloadmeowcraft-1d574e5e8fe3f08d13f1b8c4444fc4cb02cf0faf.tar.zst
meowcraft-1d574e5e8fe3f08d13f1b8c4444fc4cb02cf0faf.zip
World can now reassess chunk generation priorities on player movement and cancel no longer needed jobs
Diffstat (limited to 'src/Compute')
-rw-r--r--src/Compute/Queue.hpp31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/Compute/Queue.hpp b/src/Compute/Queue.hpp
index e201932..799df73 100644
--- a/src/Compute/Queue.hpp
+++ b/src/Compute/Queue.hpp
@@ -46,6 +46,37 @@ public:
return done_results;
}
+ struct Reassession {
+ enum { Keep, Reassess, Cancel } type;
+ Real new_priority = 0;
+ };
+
+ template <typename F>
+ void reassess(F assess) {
+ decltype(m_control->work.jobs) new_jobs{};
+
+ std::scoped_lock work_lock(m_control->work.mutex);
+ while (!m_control->work.jobs.empty()) { // I don't like std::priority_queue :(
+ Job job = m_control->work.jobs.top();
+ m_control->work.jobs.pop();
+
+ Reassession reassession = assess(job.id);
+
+ switch (reassession.type) {
+ case Reassession::Keep:
+ new_jobs.push(job);
+ break;
+ case Reassession::Reassess:
+ new_jobs.emplace(job.id, reassession.new_priority, job.execute);
+ break;
+ default:
+ break;
+ }
+ }
+
+ m_control->work.jobs = std::move(new_jobs);
+ }
+
private:
struct Job {
Job() = default;