int main(int argc, char** argv) { if (argc == 3 && strncmp(argv[1], "--convert", 9) == 0) { Configuration* config = new IniConfig(argv[2]); Heightmap* map = new Heightmap(config->getFloatValue("terrain","spacing")); if (map->loadFromImage(config->getValue("terrain","heightmap").c_str())) { std::cout << "Generating Terrain.." << std::endl; TerrainGenerator(map, config->getIntValue("terrain","chunksize"), config->getValue("out","filename").c_str()); std::cout << "..done" << std::endl; std::cout.flush(); } else std::cout << "Generation failed." << std::endl; return 0; } if (argc == 4 && strncmp(argv[1], "--load", 6) == 0) { int id = atoi(argv[3]); TerrainFileReader* reader = new TerrainFileReader(); reader->openFile(argv[2]); TerrainChunk* tc = reader->readId(id); if (tc == NULL || tc->getInfo()->getQuadId() != id) { std::cout << "Got ID" << tc->getInfo()->getQuadId() << " instead of " << id << std::endl; return 1; } else { std::cout << "Successfully got Terrainchunk " << id << std::endl; std::cout << "Spacing of Heightmap is " << tc->getHeightmap()->getSpacing() << " where origin is " << tc->getOrigin().x << "," << tc->getOrigin().y << " and center at " << tc->getCenter().x << "," << tc->getCenter().y << std::endl; } reader->closeFile(); delete tc; delete reader; } if (argc != 2 || strncmp(argv[1], "--run", 5) != 0) { std::cout << "Usage of '" << argv[0] << "'" <<std::endl; std::cout << "\nAvailable Parameter:" << "\n\t--convert terrain.desc" << "\n\t--load terrain.terr chunkid(=0)" << "\n\t--run" << std::endl; return 1; } int width, height; Configuration * win_config = new IniConfig("config.ini"); WindowHints* hints = new WindowHints(); hints->Fullscreen = win_config->getBooleanValue("Window","fullscreen"); hints->Width = win_config->getIntValue("Window","width"); hints->Height = win_config->getIntValue("Window","height"); GraphicsSystem* GSystem = new GraphicsSystem(GraphicsSystem::PROFILE_GL3, hints); if (GSystem->isError()) return -1; GraphicsContext* grctx = GSystem->getGraphicsContext(); Window* win = GSystem->getWindow(); TextureManager* tmgr = new TextureManager(grctx); ModelLoader* mmgr = new ModelLoader(grctx, tmgr); TerrainManager* terrmgr = new TerrainManager(grctx); Model* mdl, *mdl2; Camera* cam = new Camera(); win->getSize(&width, &height); cam->setScreen(width,height); cam->setupLens(65.0f, 1.0f, 1000.0f); if ((mdl = mmgr->loadAsset("Resources/Models/ant01.ms3d")) == NULL) std::cerr << "Could not load Model" << std::endl; if ((mdl2 = mmgr->loadAsset("Resources/Models/dwarf1.ms3d")) == NULL) std::cerr << "Could not load Model" << std::endl; ModelAnimationController mdlanictrl(mdl), mdlanictrl2(mdl2); mdlanictrl.addAnimation("idle", 52, 67, 0.25f, true); mdlanictrl.addAnimation("die", 30, 49, 0.25f, false); mdlanictrl2.addAnimation("begin_walk", 1, 2, 0.25f, false, "walk"); mdlanictrl2.addAnimation("walk", 2, 14, 0.25f, true); mdlanictrl2.addAnimation("jump", 28, 40, 0.5f, false, "begin_walk"); mdlanictrl2.addAnimation("idle", 292, 325, 0.25f, false, "idle2"); mdlanictrl2.addAnimation("idle2", 327, 360, 0.25f, true); mdlanictrl2.addAnimation("die", 230, 251, 0.25f, false); std::cout << "Using DesktopMode: " << width << "x" << height << std::endl; win->setTitle("Xng?! -> Yeah!"); Shader* sh = grctx->createShader(); if (!sh->loadFromFile("Shader/Animation.vs", "Shader/Animation.fs")) return 1; Shader* tsh = grctx->createShader(); if (!tsh->loadFromFile("Shader/Terrain.vs", "Shader/Terrain.fs")) return 1; Timer* t = new Timer(); double frames = 0; grctx->setClearColor(glm::vec4(1.0f, 0.5f, 0.25f, 1.0f)); t->start(); Terrain* terr = terrmgr->loadAsset("Resources/terrain/terrain.terr"); terr->setDetail(0.05f,cam); glm::mat4 mdlm = glm::scale( glm::translate(glm::mat4(1.0f), glm::vec3(5.0f, -5.0f, -20.0f)), glm::vec3(0.5f)); glm::mat4 mdlm2 = glm::scale( glm::translate(glm::mat4(1.0f), glm::vec3(-5.0f, -5.0f, -20.0f)), glm::vec3(0.18f)); mdlm = glm::rotate(mdlm, 180.0f, glm::vec3(0.0f, 1.0f, 0.0f)); mdlm2 = glm::rotate(mdlm2, 180.0f, glm::vec3(0.0f, 1.0f, 0.0f)); glm::vec3 cam_pos = glm::vec3(0.0f,0.0f,0.0f); glm::quat cam_orient = glm::quat(); float speed = 0.0f; float deltaTime = 0; float second = t->getMilli(); float lastTime = second; while (win->isOpen()) { second = t->getMilli(); deltaTime = second - lastTime; lastTime = second; if (glfwGetKey(GLFW_KEY_ESC)) break; if (glfwGetKey(GLFW_KEY_SPACE)) mdlanictrl2.setActiveAnimation("jump"); if (glfwGetKey('W')) mdlanictrl2.setActiveAnimation("begin_walk"); if (glfwGetKey('S')) mdlanictrl2.setActiveAnimation("idle"); if (glfwGetKey('F')) mdlanictrl.setActiveAnimation("die"); if (glfwGetKey('G')) mdlanictrl2.setActiveAnimation("die"); if (glfwGetKey('A')) mdlm2 = glm::rotate(mdlm2, -0.3f, glm::vec3(0.0f, 1.0f, 0.0f)); if (glfwGetKey('D')) mdlm2 = glm::rotate(mdlm2, 0.3f, glm::vec3(0.0f, 1.0f, 0.0f)); if( glfwGetKey(GLFW_KEY_LSHIFT) || glfwGetKey(GLFW_KEY_RSHIFT)) speed = 1.0f; else speed = 0.1f; if (glfwGetKey('I')) cam_pos += glm::cross(cam->getUpVector(),cam->getRightVector()) * speed * deltaTime; if (glfwGetKey('K')) cam_pos -= glm::cross(cam->getUpVector(),cam->getRightVector()) * speed * deltaTime; if (glfwGetKey('J')) cam_pos -= cam->getRightVector() * speed * deltaTime; if (glfwGetKey('L')) cam_pos += cam->getRightVector() * speed * deltaTime; if (glfwGetKey('O')) cam_pos += cam->getUpVector() * speed * deltaTime; if (glfwGetKey('P')) cam_pos -= cam->getUpVector() * speed * deltaTime; if(glfwGetKey(GLFW_KEY_LEFT)) cam_orient = glm::rotate(cam_orient,speed * deltaTime,glm::vec3(0.0f,1.0f,0.0f)); if(glfwGetKey(GLFW_KEY_RIGHT)) cam_orient =glm::rotate(cam_orient,-speed * deltaTime,glm::vec3(0.0f,1.0f,0.0f)); if(glfwGetKey(GLFW_KEY_UP)) cam_orient = glm::rotate(cam_orient,speed * deltaTime,glm::vec3(1.0f,0.0f,0.0f)); if(glfwGetKey(GLFW_KEY_DOWN)) cam_orient = glm::rotate(cam_orient,-speed * deltaTime,glm::vec3(1.0f,0.0f,0.0f)); cam_pos.y = terr->getHeightAt(cam_pos.x,cam_pos.z) + 5; cam->setPosition(cam_pos); cam->setOrientation(cam_orient); mdlanictrl.update(deltaTime); mdlanictrl2.update(deltaTime); grctx->clearDisplay(); grctx->setShader(sh); grctx->setProjectionMatrix(cam->getLens()); grctx->setViewMatrix(cam->getView()); grctx->setModelMatrix(&mdlm); for (int i = 0; i < mdl->getNumMeshes(); i++) { grctx->setMesh(mdl->getMesh(i)); grctx->setMaterial(mdl->getMaterial(mdl->getMesh(i)->getMaterialId())); grctx->setBoneTransformation(mdlanictrl.getBoneTransformation(), mdlanictrl.getNumBones()); grctx->draw(); } grctx->setModelMatrix(&mdlm2); for (int i = 0; i < mdl2->getNumMeshes(); i++) { grctx->setMesh(mdl2->getMesh(i)); grctx->setMaterial(mdl2->getMaterial(mdl2->getMesh(i)->getMaterialId())); grctx->setBoneTransformation(mdlanictrl2.getBoneTransformation(), mdlanictrl2.getNumBones()); grctx->draw(); } grctx->setShader(tsh); grctx->setProjectionMatrix(cam->getLens()); grctx->setViewMatrix(cam->getView()); terr->selectNodes(cam); grctx->swapBuffers(); frames++; } t->end(); delete sh; mmgr->removeAsset("Resources/Models/dwarf1.ms3d"); mmgr->removeAsset("Resources/Models/ant01.ms3d"); std::cout << "TpF: " << t->getLastMilli() / frames << " mspf was " << frames << " Frames in " << t->getLastMilli() << "ms or " << frames / t->getLastSecond() << "fps" << std::endl; delete mmgr; delete tmgr; delete t; delete GSystem; return 0; }