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