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";
}
Beispiel #2
0
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;
            }
        }
    }
}
Beispiel #3
0
 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;
}
Beispiel #5
0
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;
}
Beispiel #6
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;
}
Beispiel #7
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;
}