]> git.tdb.fi Git - libs/gltk.git/blob - source/partcache.cpp
560db298e8edca248b42c32bbc0926f370b70e68
[libs/gltk.git] / source / partcache.cpp
1 #include "part.h"
2 #include "partcache.h"
3
4 using namespace std;
5
6 namespace Msp {
7 namespace GLtk {
8
9 void PartCache::begin_rebuild()
10 {
11         if(rebuilding)
12                 throw logic_error("nested rebuild");
13         rebuilding = true;
14
15         next = parts.begin();
16         current = parts.end();
17 }
18
19 void PartCache::insert_special(const Part &part)
20 {
21         if(part.get_name().empty())
22                 throw invalid_argument("PartCache::insert_special");
23         if(!rebuilding)
24                 throw logic_error("!rebuilding");
25
26         current = find_if(next, parts.end(), [&part](const CachedPart &p){ return p.part==∂ });
27         if(current!=parts.end())
28                 parts.erase(next, current);
29
30         if(current==parts.end())
31                 current = parts.insert(next, CachedPart());
32         else
33                 *current = CachedPart();
34         current->part = ∂
35
36         next = current;
37         ++next;
38 }
39
40 GL::Mesh &PartCache::create_mesh(const Part &part, const GL::Texture2D &tex)
41 {
42         if(!rebuilding)
43                 throw logic_error("!rebuilding");
44
45         if(current!=parts.end() && current->texture==&tex)
46                 return *current->mesh;
47
48         for(current=next; current!=parts.end(); ++current)
49                 if(current->texture==&tex)
50                 {
51                         parts.erase(next, current);
52                         break;
53                 }
54
55         if(current==parts.end())
56         {
57                 current = parts.insert(next, CachedPart());
58                 current->texture = &tex;
59                 current->mesh = make_unique<GL::Mesh>((GL::TEXCOORD2, GL::COLOR4,GL::UNSIGNED_BYTE, GL::VERTEX2));
60         }
61         else
62                 current->mesh->clear();
63         current->part = &part;
64
65         next = current;
66         ++next;
67
68         return *current->mesh;
69 }
70
71 void PartCache::end_rebuild()
72 {
73         rebuilding = false;
74         parts.erase(next, parts.end());
75 }
76
77 } // namespace GLtk
78 } // namespace Msp