void TextureManager::loadTexture(string name, sf::Vector2i subDiv) { TextureData& data = textureMap[name]; sf::Image tmpImage; P<ResourceStream> stream = getResourceStream(name); if (!stream) stream = getResourceStream(name + ".png"); if (!stream || !tmpImage.loadFromStream(**stream)) { LOG(WARNING) << "Failed to load: " << name; data.texture.create(8, 8); return; } if (subDiv.x > 0 || subDiv.y > 0) { subDiv.x = std::max(subDiv.x, 1); subDiv.y = std::max(subDiv.y, 1); int w = tmpImage.getSize().x / subDiv.x; int h = tmpImage.getSize().y / subDiv.y; for(int y=0; y<subDiv.y; y++) { for(int x=0; x<subDiv.x; x++) { data.sprites.push_back(sf::IntRect(x*w, y*h, w, h)); } } }else{ if (autoSprite) { for(unsigned int y=0; y<tmpImage.getSize().y; y++) { for(unsigned int x=0; x<tmpImage.getSize().x; x++) { if (tmpImage.getPixel(x, y) == sf::Color(255,0,255)) { unsigned int x1=x+1; for(; x1<tmpImage.getSize().x; x1++) if (tmpImage.getPixel(x1, y) == sf::Color(255,0,255)) break; unsigned int y1=y+1; for(; y1<tmpImage.getSize().y; y1++) if (tmpImage.getPixel(x, y1) == sf::Color(255,0,255)) break; if (x1-x > 1 && y1-y > 1 && x1<tmpImage.getSize().x && y1<tmpImage.getSize().y) data.sprites.push_back(sf::IntRect(x+1, y+1, x1-x-1, y1-y-1)); x = x1-1; } } } } } data.texture.setRepeated(defaultRepeated); data.texture.setSmooth(defaultSmooth); data.texture.loadFromImage(tmpImage); LOG(INFO) << "Loaded: " << name << " with " << data.sprites.size() << " sprites"; }
void ColorConfig::load() { std::unordered_map<string, std::vector<sf::Color*>> color_mapping; DEF_COLOR(background); DEF_COLOR(radar_outline); DEF_WIDGETCOLORSET(button); DEF_WIDGETCOLORSET(label); DEF_WIDGETCOLORSET(text_entry); DEF_WIDGETCOLORSET(slider); P<ResourceStream> stream = getResourceStream("gui/colors.ini"); if(!stream) return; while(stream->tell() < stream->getSize()) { string line = stream->readLine(); if (line.find("//") > -1) line = line.substr(0, line.find("//")).strip(); if (line.find("=") > -1) { string key = line.substr(0, line.find("=")).strip().lower(); string value = line.substr(line.find("=") + 1).strip(); sf::Color color = sf::Color(255, 0, 255); if (value.startswith("#")) value = value.substr(1); if (value.length() == 6) color = sf::Color((value.toInt(16) << 8) | 0xFF); else if (value.length() == 8) color = sf::Color(value.toInt(16)); else LOG(WARNING) << "Failed to parse color: " << key << " " << value; if (color_mapping.find(key) != color_mapping.end()) { for(sf::Color* ptr : color_mapping[key]) *ptr = color; }else{ LOG(WARNING) << "Unknown color definition: " << key; } } } }
SecretMenu() : Renderable(hudLayer) { selectionIndex = 0; delay = 0; timeout = 10 * 60; eventManager.fire("glitch"); P<ResourceStream> s = getResourceStream("secretoptions.txt"); if (!s) return; for(string line = s->readLine(); line.length() > 0; line = s->readLine()) { std::vector<string> parts = line.split(":", 1); if (parts.size() == 2) { options.push_back(SecretMenuOption()); options[options.size()-1].name = parts[0]; options[options.size()-1].command = parts[1]; } } }
ScenarioInfo::ScenarioInfo(string filename) { this->filename = filename; name = filename.substr(9, -4); P<ResourceStream> stream = getResourceStream(filename); if (!stream) return; string key; string value; while(stream->tell() < stream->getSize()) { string line = stream->readLine().strip(); // Get the scenario meta-data. if (!line.startswith("--")) break; if (line.startswith("---")) { line = line.substr(3).strip(); value = value + "\n" + line; }else{ line = line.substr(2).strip(); if (line.find(":") < 0) { key = ""; continue; } addKeyValue(key, value); key = line.substr(0, line.find(":")).strip(); value = line.substr(line.find(":") + 1).strip(); } } addKeyValue(key, value); if (type == "") LOG(WARNING) << "No scenario type for: " << filename; }
int main(int argc, char** argv) { #ifdef __APPLE__ // TODO: Find a proper solution. // Seems to be non-NULL even outside of a proper bundle. CFBundleRef bundle = CFBundleGetMainBundle(); if (bundle) { char bundle_path[PATH_MAX], exe_path[PATH_MAX]; CFURLRef bundleURL = CFBundleCopyBundleURL(bundle); CFURLGetFileSystemRepresentation(bundleURL, true, (unsigned char*)bundle_path, PATH_MAX); CFRelease(bundleURL); uint32_t size = sizeof(exe_path); if (_NSGetExecutablePath(exe_path, &size) != 0) { fprintf(stderr, "Failed to get executable path.\n"); return 1; } char *exe_realpath = realpath(exe_path, NULL); char *exe_dir = dirname(exe_realpath); if (strcmp(exe_dir, bundle_path)) { char resources_path[PATH_MAX]; CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(bundle); CFURLGetFileSystemRepresentation(resourcesURL, true, (unsigned char*)resources_path, PATH_MAX); CFRelease(resourcesURL); chdir(resources_path); } else { chdir(exe_dir); } free(exe_realpath); free(exe_dir); } #endif #ifdef DEBUG Logging::setLogLevel(LOGLEVEL_DEBUG); #else Logging::setLogLevel(LOGLEVEL_INFO); #endif #if defined(__WIN32__) && !defined(DEBUG) Logging::setLogFile("EmptyEpsilon.log"); #endif #ifdef RESOURCE_BASE_DIR PreferencesManager::load(RESOURCE_BASE_DIR "options.ini"); #endif if (getenv("HOME")) PreferencesManager::load(string(getenv("HOME")) + "/.emptyepsilon/options.ini"); else PreferencesManager::load("options.ini"); for(int n=1; n<argc; n++) { char* value = strchr(argv[n], '='); if (!value) continue; *value++ = '\0'; PreferencesManager::set(string(argv[n]).strip(), string(value).strip()); } new Engine(); if (PreferencesManager::get("mod") != "") { string mod = PreferencesManager::get("mod"); if (getenv("HOME")) { new DirectoryResourceProvider(string(getenv("HOME")) + "/.emptyepsilon/resources/mods/" + mod); PackResourceProvider::addPackResourcesForDirectory(string(getenv("HOME")) + "/.emptyepsilon/resources/mods/" + mod); } new DirectoryResourceProvider("resources/mods/" + mod); PackResourceProvider::addPackResourcesForDirectory("resources/mods/" + mod); } #ifdef RESOURCE_BASE_DIR new DirectoryResourceProvider(RESOURCE_BASE_DIR "resources/"); new DirectoryResourceProvider(RESOURCE_BASE_DIR "scripts/"); new DirectoryResourceProvider(RESOURCE_BASE_DIR "packs/SolCommand/"); PackResourceProvider::addPackResourcesForDirectory(RESOURCE_BASE_DIR "packs"); #endif if (getenv("HOME")) { new DirectoryResourceProvider(string(getenv("HOME")) + "/.emptyepsilon/resources/"); new DirectoryResourceProvider(string(getenv("HOME")) + "/.emptyepsilon/scripts/"); new DirectoryResourceProvider(string(getenv("HOME")) + "/.emptyepsilon/packs/SolCommand/"); } new DirectoryResourceProvider("resources/"); new DirectoryResourceProvider("scripts/"); new DirectoryResourceProvider("packs/SolCommand/"); PackResourceProvider::addPackResourcesForDirectory("packs"); textureManager.setDefaultSmooth(true); textureManager.setDefaultRepeated(true); textureManager.setAutoSprite(false); textureManager.getTexture("Tokka_WalkingMan.png", sf::Vector2i(6, 1)); //Setup the sprite mapping. if (PreferencesManager::get("httpserver").toInt() != 0) { int port_nr = PreferencesManager::get("httpserver").toInt(); if (port_nr < 10) port_nr = 80; LOG(INFO) << "Enabling HTTP script access on port: " << port_nr; LOG(INFO) << "NOTE: This is potentially a risk!"; HttpServer* server = new HttpServer(port_nr); server->addHandler(new HttpRequestFileHandler("www")); server->addHandler(new HttpScriptHandler()); } colorConfig.load(); if (PreferencesManager::get("headless") == "") { //Setup the rendering layers. backgroundLayer = new RenderLayer(); objectLayer = new RenderLayer(backgroundLayer); effectLayer = new RenderLayer(objectLayer); hudLayer = new RenderLayer(effectLayer); mouseLayer = new RenderLayer(hudLayer); glitchPostProcessor = new PostProcessor("glitch", mouseLayer); glitchPostProcessor->enabled = false; warpPostProcessor = new PostProcessor("warp", glitchPostProcessor); warpPostProcessor->enabled = false; defaultRenderLayer = objectLayer; int width = 1200; int height = 900; int fsaa = 0; bool fullscreen = PreferencesManager::get("fullscreen", "1").toInt(); if (PreferencesManager::get("fsaa").toInt() > 0) { fsaa = PreferencesManager::get("fsaa").toInt(); if (fsaa < 2) fsaa = 2; } P<WindowManager> window_manager = new WindowManager(width, height, fullscreen, warpPostProcessor, fsaa); window_manager->setAllowVirtualResize(true); engine->registerObject("windowManager", window_manager); } if (PreferencesManager::get("touchscreen").toInt()) { InputHandler::touch_screen = true; } if (!InputHandler::touch_screen) { engine->registerObject("mouseRenderer", new MouseRenderer()); } new DebugRenderer(); if (PreferencesManager::get("touchcalibfile") != "") { FILE* f = fopen(PreferencesManager::get("touchcalibfile").c_str(), "r"); if (f) { float m[6]; if (fscanf(f, "%f %f %f %f %f %f", &m[0], &m[1], &m[2], &m[3], &m[4], &m[5]) == 6) InputHandler::mouse_transform = sf::Transform(m[0], m[1], m[2], m[3], m[4], m[5], 0, 0, 1); fclose(f); } } soundManager->setMusicVolume(PreferencesManager::get("music_volume", "50").toFloat()); if (PreferencesManager::get("disable_shaders").toInt()) PostProcessor::setEnable(false); P<ResourceStream> main_font_stream = getResourceStream("gui/fonts/BebasNeue Regular.otf"); main_font = new sf::Font(); main_font->loadFromStream(**main_font_stream); P<ResourceStream> bold_font_stream = getResourceStream("gui/fonts/BebasNeue Bold.otf"); bold_font = new sf::Font(); bold_font->loadFromStream(**bold_font_stream); if (sf::Shader::isAvailable()) { objectShader = new sf::Shader(); simpleObjectShader = new sf::Shader(); basicShader = new sf::Shader(); billboardShader = new sf::Shader(); P<ResourceStream> vertexStream = getResourceStream("objectShader.vert"); P<ResourceStream> fragmentStream = getResourceStream("objectShader.frag"); objectShader->loadFromStream(**vertexStream, **fragmentStream); vertexStream = getResourceStream("simpleObjectShader.vert"); fragmentStream = getResourceStream("simpleObjectShader.frag"); simpleObjectShader->loadFromStream(**vertexStream, **fragmentStream); vertexStream = getResourceStream("basicShader.vert"); fragmentStream = getResourceStream("basicShader.frag"); basicShader->loadFromStream(**vertexStream, **fragmentStream); vertexStream = getResourceStream("billboardShader.vert"); fragmentStream = getResourceStream("billboardShader.frag"); billboardShader->loadFromStream(**vertexStream, **fragmentStream); } { P<ScriptObject> modelDataScript = new ScriptObject("model_data.lua"); if (modelDataScript->getError() != "") exit(1); modelDataScript->destroy(); P<ScriptObject> shipTemplatesScript = new ScriptObject("shipTemplates.lua"); if (shipTemplatesScript->getError() != "") exit(1); shipTemplatesScript->destroy(); P<ScriptObject> factionInfoScript = new ScriptObject("factionInfo.lua"); if (factionInfoScript->getError() != "") exit(1); factionInfoScript->destroy(); fillDefaultDatabaseData(); P<ScriptObject> scienceInfoScript = new ScriptObject("science_db.lua"); if (scienceInfoScript->getError() != "") exit(1); scienceInfoScript->destroy(); //Find out which model data isn't used by ship templates and output that to log. std::set<string> used_model_data; for(string template_name : ShipTemplate::getAllTemplateNames()) used_model_data.insert(ShipTemplate::getTemplate(template_name)->model_data->getName()); for(string name : ModelData::getModelDataNames()) { if (used_model_data.find(name) == used_model_data.end()) { LOG(INFO) << "Model data: " << name << " is not used by any ship template"; } } } P<HardwareController> hardware_controller = new HardwareController(); #ifdef RESOURCE_BASE_DIR hardware_controller->loadConfiguration(RESOURCE_BASE_DIR "hardware.ini"); #endif if (getenv("HOME")) hardware_controller->loadConfiguration(string(getenv("HOME")) + "/.emptyepsilon/hardware.ini"); else hardware_controller->loadConfiguration("hardware.ini"); returnToMainMenu(); engine->runMainLoop(); P<WindowManager> windowManager = engine->getObject("windowManager"); if (windowManager) { PreferencesManager::set("fsaa", windowManager->getFSAA()); PreferencesManager::set("fullscreen", windowManager->isFullscreen() ? 1 : 0); } PreferencesManager::set("music_volume", soundManager->getMusicVolume()); PreferencesManager::set("disable_shaders", PostProcessor::isEnabled() ? 0 : 1); if (PreferencesManager::get("headless") == "") { #ifndef _MSC_VER // MFC TODO: Fix me -- save prefs to user prefs dir on Windows. if (getenv("HOME")) { #ifdef __WIN32__ mkdir((string(getenv("HOME")) + "/.emptyepsilon").c_str()); #else mkdir((string(getenv("HOME")) + "/.emptyepsilon").c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); #endif PreferencesManager::save(string(getenv("HOME")) + "/.emptyepsilon/options.ini"); }else #endif { PreferencesManager::save("options.ini"); } } delete engine; return 0; }
int main(int argc, char** argv) { new Engine(); new DirectoryResourceProvider("resources/"); textureManager.setDefaultSmooth(true); textureManager.setDefaultRepeated(true); textureManager.setAutoSprite(false); //Setup the rendering layers. backgroundLayer = new RenderLayer(); objectLayer = new RenderLayer(backgroundLayer); effectLayer = new RenderLayer(objectLayer); hudLayer = new RenderLayer(effectLayer); mouseLayer = new RenderLayer(hudLayer); glitchPostProcessor = new PostProcessor("glitch", mouseLayer); glitchPostProcessor->enabled = false; defaultRenderLayer = objectLayer; int width = 1600; int height = 900; int fsaa = 0; bool fullscreen = true; #ifdef DEBUG fullscreen = false; #endif engine->registerObject("windowManager", new WindowManager(width, height, fullscreen, glitchPostProcessor, fsaa)); engine->registerObject("mouseRenderer", new MouseRenderer()); soundManager.setMusicVolume(50); randomNebulas(); P<ResourceStream> stream = getResourceStream("sansation.ttf"); mainFont.loadFromStream(**stream); P<ResourceStream> vertexStream = getResourceStream("objectShader.vert"); P<ResourceStream> fragmentStream = getResourceStream("objectShader.frag"); objectShader.loadFromStream(**vertexStream, **fragmentStream); vertexStream = getResourceStream("basicShader.vert"); fragmentStream = getResourceStream("basicShader.frag"); basicShader.loadFromStream(**vertexStream, **fragmentStream); P<ScriptObject> shipTemplatesScript = new ScriptObject("shipTemplates.lua"); shipTemplatesScript->destroy(); factionInfo[0].name = "Neutral"; factionInfo[1].name = "Human"; factionInfo[2].name = "SpaceCow"; factionInfo[3].name = "Sheeple"; factionInfo[4].name = "PirateScorpions"; factionInfo[0].gm_color = sf::Color(128, 128, 128); factionInfo[1].gm_color = sf::Color(255, 255, 255); factionInfo[2].gm_color = sf::Color(255, 0, 0); factionInfo[3].gm_color = sf::Color(255, 128, 0); factionInfo[4].gm_color = sf::Color(255, 0, 128); FactionInfo::setState(0, 4, FVF_Enemy); FactionInfo::setState(1, 2, FVF_Enemy); FactionInfo::setState(1, 3, FVF_Enemy); FactionInfo::setState(1, 4, FVF_Enemy); FactionInfo::setState(2, 3, FVF_Enemy); FactionInfo::setState(2, 4, FVF_Enemy); FactionInfo::setState(3, 4, FVF_Enemy); new MainMenu(); engine->runMainLoop(); delete engine; return 0; }
Mesh* Mesh::getMesh(string filename) { Mesh* ret = meshMap[filename]; if (ret) return ret; P<ResourceStream> stream = getResourceStream(filename); if (!stream) return NULL; std::vector<sf::Vector3f> vertices; std::vector<sf::Vector3f> normals; std::vector<sf::Vector2f> texCoords; std::vector<IndexInfo> indices; ret = new Mesh(); do { string line = stream->readLine(); if (line.length() > 0 && line[0] != '#') { std::vector<string> parts = line.split(); if (parts[0] == "v") { vertices.push_back(sf::Vector3f(parts[1].toFloat(), parts[2].toFloat(), parts[3].toFloat())); }else if (parts[0] == "vn") { normals.push_back(sf::normalize(sf::Vector3f(parts[1].toFloat(), parts[2].toFloat(), parts[3].toFloat()))); }else if (parts[0] == "vt") { texCoords.push_back(sf::Vector2f(parts[1].toFloat(), parts[2].toFloat())); }else if (parts[0] == "f") { for(unsigned int n=3; n<parts.size(); n++) { std::vector<string> p0 = parts[1].split("/"); std::vector<string> p1 = parts[n].split("/"); std::vector<string> p2 = parts[n-1].split("/"); IndexInfo info; info.v = p0[0].toInt() - 1; info.t = p0[1].toInt() - 1; info.n = p0[2].toInt() - 1; indices.push_back(info); info.v = p1[0].toInt() - 1; info.t = p1[1].toInt() - 1; info.n = p1[2].toInt() - 1; indices.push_back(info); info.v = p2[0].toInt() - 1; info.t = p2[1].toInt() - 1; info.n = p2[2].toInt() - 1; indices.push_back(info); } }else{ //printf("%s\n", parts[0].c_str()); } } }while(stream->tell() < stream->getSize()); ret->vertexCount = indices.size(); ret->vertices = new MeshVertex[indices.size()]; for(unsigned int n=0; n<indices.size(); n++) { ret->vertices[n].position[0] = vertices[indices[n].v].z; ret->vertices[n].position[1] = vertices[indices[n].v].x; ret->vertices[n].position[2] = vertices[indices[n].v].y; ret->vertices[n].normal[0] = normals[indices[n].n].z; ret->vertices[n].normal[1] = normals[indices[n].n].x; ret->vertices[n].normal[2] = normals[indices[n].n].y; ret->vertices[n].uv[0] = texCoords[indices[n].t].x; ret->vertices[n].uv[1] = 1.0 - texCoords[indices[n].t].y; } meshMap[filename] = ret; return ret; }