diff options
| -rw-r--r-- | SConstruct | 2 | ||||
| m--------- | common | 0 | ||||
| -rw-r--r-- | game.cpp | 22 | ||||
| -rw-r--r-- | game.h | 1 | ||||
| -rw-r--r-- | main.cpp | 3 | ||||
| -rw-r--r-- | model.cpp | 23 | ||||
| -rw-r--r-- | model.h | 15 | ||||
| -rw-r--r-- | scene.cpp | 13 | ||||
| -rw-r--r-- | scene.h | 5 | ||||
| -rw-r--r-- | terrain.cpp | 6 | ||||
| -rw-r--r-- | terrain.h | 2 | 
11 files changed, 78 insertions, 14 deletions
| @@ -15,7 +15,7 @@ if GetOption('mingw32'):  	env.Append(CPPPATH = ['/usr/i486-mingw32/include/' + x for x in ('SDL', 'CEGUI', 'freetype2')])  	env.Append(LIBS = ['CEGUIOpenGLRenderer', 'CEGUIBase', 'CEGUITGAImageCodec', 'CEGUITinyXMLParser', 'CEGUIFalagardWRBase', 'CEGUISILLYImageCodec',  		'SDL_image', 'ftgl', 'freetype-s', 'z', 'pcre', 'opengl32', 'glu32', 'winmm', 'wsock32', 'ws2_32', 'mingw32', 'SDLmain', 'SDL', 'jpeg', 'noise', -		'lua', 'tolua++_Static', 'boost_filesystem-mt-s', 'boost_system-mt-s']) +		'lua', 'tolua++_Static', 'boost_filesystem-mt-s', 'boost_system-mt-s', 'assimp'])  	env.Append(CPPFLAGS = ['-D_WIN32_WINNT=0x0501'])  	env.Append(LINKFLAGS = ['-static-libgcc', '-static-libstdc++'])  	env['CXX'] = 'i486-mingw32-g++' diff --git a/common b/common -Subproject 6e746716d6a5c72fbd42539c6d5d92da8830cb9 +Subproject e95b3cb3e1a054a9d6bd766d4904e569ac2b2a6 @@ -171,9 +171,20 @@ void Game::handle_object() {  		std::cerr << "got object for non-existing chunk, discarding" << std::endl;  		return;  	} -  	pos.y = chunk->find(pos.x, pos.z)->get_height(pos.x, pos.z); -	chunk->objects.push_back(Terrain::Chunk::ObjectPair(scene->tree, pos)); + +	int64_t x = pos.x; +	x -= x % Terrain::chunk_size; + +	int64_t z = pos.z; +	z -= z % Terrain::chunk_size; + +	TerrainCacheObject::p ob = scene->terrain->tc->get_chunk(x, z, Terrain::chunk_size_total, Terrain::chunk_size_total); +	ob->objects.push_back(pos); + +	models::ModelManager& model_mgr = models::ModelManager::get_instance(); + +	chunk->objects.push_back(Terrain::Chunk::ObjectPair(model_mgr.get_model("tree"), pos));  }  Game& Game::get_instance() { @@ -181,3 +192,10 @@ Game& Game::get_instance() {  		game = new Game();  	return *game;  } + +void Game::free() { +	if(game) { +		delete game; +		game = NULL; +	} +} @@ -33,6 +33,7 @@ class Game {  		void handle_object();  		static Game& get_instance(); +		static void free();  };  #endif @@ -39,6 +39,9 @@ int main(int argc, char **argv) {  	game.run(argv[1], argv[2]); +	// free singleton to run destructors +	game.free(); +  	video::free();  	return 0; @@ -101,4 +101,27 @@ void Tree::render() {  	leaves->render();  } +/* ModelManager */ + +ModelManager *ModelManager::model_mgr = NULL; + +void ModelManager::add_model(const std::string name, Model::p model) { +	models.insert(std::pair<const std::string, Model::p>(name, model)); +} + +Model::p ModelManager::get_model(const std::string name) { +	std::map<const std::string, Model::p>::iterator it = models.find(name); +	if(it != models.end()) +		return it->second; + +	return Model::p(); +} + +ModelManager& ModelManager::get_instance() { +	if(!model_mgr) +		model_mgr = new ModelManager(); + +	return *model_mgr; +} +  } // namespace models @@ -5,6 +5,7 @@  #include <assimp/assimp.hpp>  #include <assimp/aiScene.h> +#include <boost/shared_ptr.hpp>  #include <map>  #include <string> @@ -28,6 +29,8 @@ class Mesh {  class Model {  	public: +		typedef boost::shared_ptr<Model> p; +  		virtual ~Model() {};  		virtual void render() = 0; @@ -45,6 +48,18 @@ class Tree : public Model {  		virtual void render();  }; +class ModelManager { +	private: +		static ModelManager *model_mgr; +		std::map<const std::string, Model::p> models; + +	public: +		void add_model(const std::string name, Model::p model); +		Model::p get_model(const std::string name); + +		static ModelManager& get_instance(); +}; +  }  #endif @@ -11,6 +11,8 @@  #include <cmath> +using models::ModelManager; +  Scene::Scene() {  	running = true;  	grid = false; @@ -70,7 +72,8 @@ Scene::Scene() {  	marker_texture = load_texture("textures/cross.png");  	placeholder_texture = load_texture("textures/placeholder.png"); -	tree_scene = ai_importer.ReadFile("models/trees.blend", aiProcess_Triangulate); +	Assimp::Importer ai_importer; +	const aiScene *tree_scene = ai_importer.ReadFile("models/trees.blend", aiProcess_Triangulate);  	for(unsigned int i = 0; i < tree_scene->mNumTextures; i++) {  		aiTexture *texture = tree_scene->mTextures[i]; @@ -79,7 +82,8 @@ Scene::Scene() {  		scene_textures.insert(std::pair<std::string, GLuint>(name, tx));  	} -	tree = new models::Tree(tree_scene, scene_textures); +	Model::p tree = Model::p(new models::Tree(tree_scene, scene_textures)); +	ModelManager::get_instance().add_model("tree", tree);  	/* init terrain */  	terrain = new Terrain(); @@ -105,7 +109,6 @@ Scene::~Scene() {  	delete lua;  	if(tool)  		delete tool; -	delete tree;  	if(terrain)  		delete terrain;  	delete font; @@ -621,8 +624,8 @@ void Scene::render() {  	float height = font->LineHeight();  	glColor3f(1, 1, 1);  	glTranslatef(0, video::height-height, 0); -	font->Render((boost::format("chunks: %d  cache: %d  gravity: %d  flying: %d  water: %d  steps: %d") -				% terrain->chunks.size() % terrain->tc->get_size() % gravity % flying % underwater % steps).str().c_str()); +	font->Render((boost::format("chunks: %d  cache: %d  gravity: %d  flying: %d  water: %d  steps: %d  trees: %d") +				% terrain->chunks.size() % terrain->tc->get_size() % gravity % flying % underwater % steps % trees.size()).str().c_str());  	glTranslatef(0, -height, 0);  	font->Render(move_str.c_str());  	glTranslatef(0, -height, 0); @@ -56,11 +56,6 @@ class Scene {  		GLuint grass_texture, rock_texture, soil_texture, water_texture, marker_texture, placeholder_texture;  		std::map<std::string, GLuint> scene_textures; -		Assimp::Importer ai_importer; -		const aiScene *tree_scene; - -		Model *tree; -  		Scene();  		~Scene(); diff --git a/terrain.cpp b/terrain.cpp index e32a52b..f3dcb33 100644 --- a/terrain.cpp +++ b/terrain.cpp @@ -133,6 +133,12 @@ Terrain::Chunk::Chunk(Terrain *terrain, float x, float y) : cache_obj(terrain->t  	this->vbo_object = this->node_count = this->vertices = 0;  	this->nodes = NULL;  	heights = cache_obj->heights; + +	for(std::list<Vector3>::iterator it = cache_obj->objects.begin(); it != cache_obj->objects.end(); it++) { +		models::Model::p tree = models::ModelManager::get_instance().get_model("tree"); +		objects.push_back(ObjectPair(tree, *it)); +	} +  	normals = new Vector3[(int)((n_width)*(n_height))];  	calc_normals(); @@ -30,7 +30,7 @@ class Terrain {  		};  		struct Chunk { -			typedef std::pair<models::Model*, Vector3> ObjectPair; +			typedef std::pair<models::Model::p, Vector3> ObjectPair;  			typedef std::list<ObjectPair> ObjectList;  			Terrain *terrain; | 
