]> git.tdb.fi Git - libs/gltk.git/blob - source/partcache.cpp
Reuse meshes in PartCache to avoid buffer create/delete spam
[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         part(0),
11         texture(0),
12         mesh(0)
13 { }
14
15 CachedPart::~CachedPart()
16 {
17         delete mesh;
18 }
19
20
21 void PartCache::begin_rebuild()
22 {
23         next = parts.begin();
24         current = parts.end();
25 }
26
27 void PartCache::insert_special(const Part &part)
28 {
29         if(part.get_name().empty())
30                 throw invalid_argument("PartCache::insert_special");
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(current!=parts.end() && current->texture==&tex)
52                 return *current->mesh;
53
54         for(current=next; current!=parts.end(); ++current)
55                 if(current->texture==&tex)
56                 {
57                         parts.erase(next, current);
58                         break;
59                 }
60
61         if(current==parts.end())
62         {
63                 current = parts.insert(next, CachedPart());
64                 current->texture = &tex;
65                 current->mesh = new GL::Mesh((GL::TEXCOORD2, GL::COLOR4_UBYTE, GL::VERTEX2));
66         }
67         else
68                 current->mesh->clear();
69         current->part = ∂
70
71         next = current;
72         ++next;
73
74         return *current->mesh;
75 }
76
77 void PartCache::end_rebuild()
78 {
79         parts.erase(next, parts.end());
80 }
81
82 } // namespace GLtk
83 } // namespace Msp