]> git.lizzy.rs Git - dragonblocks3d.git/blob - src/dragonblocks/mesh_gen_mgr.cpp
Multithreading
[dragonblocks3d.git] / src / dragonblocks / mesh_gen_mgr.cpp
1 #include <set>
2 #include "mesh_gen_mgr.hpp"
3 #include "window.hpp"
4
5 using namespace std;
6 using namespace dragonblocks;
7
8 void MeshGenMgr::MeshGenerator::updateMesh()
9 {
10 }
11
12 void MeshGenMgr::addTask(MeshGenMgr::MeshGenerator *gen)
13 {
14         queued_jobs.push(gen);
15 }
16
17 void MeshGenMgr::step()
18 {
19         if (! runJob()) {
20                 generateJobList();
21         }
22 }
23
24 void MeshGenMgr::run()
25 {
26         while (true) {
27                 step();
28         }
29 }
30
31 void MeshGenMgr::generateJobList()
32 {
33         set<MeshGenMgr::MeshGenerator *> active_jobs_set;
34         while (! queued_jobs.empty()) {
35                 MeshGenMgr::MeshGenerator *gen = queued_jobs.front();
36                 queued_jobs.pop();
37                 if (active_jobs_set.find(gen) == active_jobs_set.end()) {
38                         active_jobs_set.insert(gen);
39                         active_jobs.push(gen);
40                 }
41         }
42 }
43
44
45 bool MeshGenMgr::runJob()
46 {
47         if (active_jobs.empty())
48                 return false;
49         MeshGenMgr::MeshGenerator *gen = active_jobs.front();
50         active_jobs.pop();
51         if (gen) {
52                 gen->updateMesh();
53         }
54         return true;
55 }
56
57 void MeshGenMgr::start()
58 {
59         mesh_gen_thread = thread(&MeshGenMgr::run, this);
60 }