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