1 /*
2  Copyright (c) 2013 yvt
3 
4  This file is part of OpenSpades.
5 
6  OpenSpades is free software: you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  OpenSpades is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with OpenSpades.  If not, see <http://www.gnu.org/licenses/>.
18 
19  */
20 #include <memory>
21 
22 #include "GLModelManager.h"
23 #include <Core/Debug.h>
24 #include <Core/FileManager.h>
25 #include <Core/IStream.h>
26 #include <Core/Settings.h>
27 #include <Core/VoxelModel.h>
28 #include "GLRenderer.h"
29 #include "GLVoxelModel.h"
30 
31 namespace spades {
32 	namespace draw {
GLModelManager(GLRenderer * r)33 		GLModelManager::GLModelManager(GLRenderer *r) {
34 			SPADES_MARK_FUNCTION();
35 
36 			renderer = r;
37 		}
~GLModelManager()38 		GLModelManager::~GLModelManager() {
39 			SPADES_MARK_FUNCTION();
40 
41 			for (std::map<std::string, GLModel *>::iterator it = models.begin(); it != models.end();
42 			     it++) {
43 				it->second->Release();
44 			}
45 		}
46 
RegisterModel(const char * name)47 		GLModel *GLModelManager::RegisterModel(const char *name) {
48 			SPADES_MARK_FUNCTION();
49 
50 			std::map<std::string, GLModel *>::iterator it;
51 			it = models.find(std::string(name));
52 			if (it == models.end()) {
53 				GLModel *m = CreateModel(name);
54 				models[name] = m;
55 				m->AddRef();
56 				return m;
57 			}
58 			it->second->AddRef(); // model manager owns this reference
59 			return it->second;
60 		}
61 
CreateModel(const char * name)62 		GLModel *GLModelManager::CreateModel(const char *name) {
63 			SPADES_MARK_FUNCTION();
64 
65 			std::unique_ptr<IStream> stream{FileManager::OpenForReading(name)};
66 			Handle<VoxelModel> voxelModel{VoxelModel::LoadKV6(stream.get()), false};
67 
68 			return static_cast<GLModel *>(renderer->CreateModelOptimized(voxelModel));
69 		}
70 	}
71 }
72