Пример #1
0
/** @copydoc widgetdata::draw_func */
static void widget_draw(widgetdata *widget)
{
    SDL_Rect box;
    size_t i;

    /* Create the skill list. */
    if (!list_skills) {
        list_skills = list_create(5, 4, 8);
        list_skills->post_column_func = list_post_column;
        list_skills->row_color_func = list_row_color;
        list_skills->row_selected_func = NULL;
        list_skills->row_highlight_func = NULL;
        list_skills->surface = widget->surface;
        list_skills->row_height_adjust = INVENTORY_ICON_SIZE;
        list_set_font(list_skills, NULL);
        list_scrollbar_enable(list_skills);
        list_set_column(list_skills, 0, INVENTORY_ICON_SIZE, 0, NULL, -1);
        list_set_column(list_skills, 1, INVENTORY_ICON_SIZE, 0, NULL, -1);
        list_set_column(list_skills, 2, INVENTORY_ICON_SIZE, 0, NULL, -1);
        list_set_column(list_skills, 3, INVENTORY_ICON_SIZE, 0, NULL, -1);
        skill_list_reload();

        for (i = 0; i < BUTTON_NUM; i++) {
            button_create(&buttons[i]);
            buttons[i].texture = texture_get(TEXTURE_TYPE_CLIENT, "button_round");
            buttons[i].texture_pressed = texture_get(TEXTURE_TYPE_CLIENT, "button_round_down");
            buttons[i].texture_over = texture_get(TEXTURE_TYPE_CLIENT, "button_round_over");
        }
    }

    if (widget->redraw) {
        box.h = 0;
        box.w = widget->w;
        text_show(widget->surface, FONT_SERIF12, "Skills", 0, 3, COLOR_HGOLD, TEXT_ALIGN_CENTER, &box);
        list_set_parent(list_skills, widget->x, widget->y);
        list_show(list_skills, 10, 2);

        for (i = 0; i < BUTTON_NUM; i++) {
            buttons[i].surface = widget->surface;
            button_set_parent(&buttons[i], widget->x, widget->y);
        }

        buttons[BUTTON_CLOSE].x = widget->w - texture_surface(buttons[BUTTON_CLOSE].texture)->w - 4;
        buttons[BUTTON_CLOSE].y = 4;
        button_show(&buttons[BUTTON_CLOSE], "X");

        buttons[BUTTON_HELP].x = widget->w - texture_surface(buttons[BUTTON_HELP].texture)->w * 2 - 4;
        buttons[BUTTON_HELP].y = 4;
        button_show(&buttons[BUTTON_HELP], "?");
    }
}
Пример #2
0
int fime_ship_init(void)
{
  int err;
  ship_obj = 0;
  texid = -1;

  MtxIdentity(mtx);
  memset(&angle, 0, sizeof(angle));

  ship_obj = (obj_driver_t *)driver_list_search(&obj_drivers,"bebop");
  if (!ship_obj) {
    ship_obj = (obj_driver_t *)driver_list_search(&obj_drivers,"spaceship1");
  }
  err = !ship_obj;
  if (err) {
    SDDEBUG("[fime] : No ship object\n");
  } 
  texid = texture_get("fime_bordertile");
  if (texid < 0) {
    SDDEBUG("[fime] : No bordertex\n");
    err = 1;
  }

  return -(!!err);
}
Пример #3
0
Texture *texture_with_name_new(const char *name, const char *path)
{
    if(strlen(name) > MAX_PATH_LENGTH)
        Util_FatalError("File following texture name is too long: %s", name);

    Texture *tex;
    tex = texture_get(name);

    if(tex != NULL)
        return tex;

    if(render.num_textures >= MAX_TEXTURES)
        return NULL;

    /** Alloc the new texture **/
    tex = malloc( sizeof(Texture) );
    memset(tex, 0, sizeof(Texture) );
    tex->number_of_rows = 1;
    tex->type = GL_TEXTURE_2D;

    SDL_Surface *data = IMG_Load(path);

    if(data == NULL)
        Util_FatalError("Texture %s could not be found!\n", path);

    glGenTextures(1, &tex->tex_id);
    glBindTexture(GL_TEXTURE_2D, tex->tex_id);

    SDL_LockSurface(data);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, data->w, data->h, GL_FALSE, GL_RGBA, GL_UNSIGNED_BYTE, data->pixels);
    SDL_UnlockSurface(data);
    SDL_FreeSurface(data);

    /** Configure the texture **/
    glGenerateMipmap(GL_TEXTURE_2D);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, -2.4);

    glBindTexture(GL_TEXTURE_2D, 0);

    /** Register inside the resource manager **/
    unsigned int hash_ = Util_Hash( name );
    hash_ %= MAX_HASH_TEXTURES;

    render.textures[render.num_textures] = tex;
    render.num_textures += 1;

    strcpy(tex->_name, name);
    tex->_hash_next = texture_hash_table[hash_];
    texture_hash_table[hash_] = tex;

    tex->hash_ = hash_;

    /** Return the final result **/
    return tex;
}
Пример #4
0
/** @copydoc widgetdata::background_func */
static void widget_background(widgetdata *widget, int draw)
{
    size_t i;

    /* Create the party list. */
    if (!list_party) {
        list_party = list_create(12, 2, 8);
        list_party->handle_enter_func = list_handle_enter;
        list_party->text_flags = TEXT_MARKUP;
        list_party->row_highlight_func = list_row_highlight;
        list_party->row_selected_func = list_row_selected;
        list_scrollbar_enable(list_party);
        list_set_column(list_party, 0, 130, 7, NULL, -1);
        list_set_column(list_party, 1, 60, 7, NULL, -1);
        list_party->header_height = 6;

        for (i = 0; i < BUTTON_NUM; i++) {
            button_create(&buttons[i]);

            if (i == BUTTON_CLOSE || i == BUTTON_HELP) {
                buttons[i].texture = texture_get(TEXTURE_TYPE_CLIENT, "button_round");
                buttons[i].texture_pressed = texture_get(TEXTURE_TYPE_CLIENT, "button_round_down");
                buttons[i].texture_over = texture_get(TEXTURE_TYPE_CLIENT, "button_round_over");
            } else if (i == BUTTON_PARTIES || i == BUTTON_MEMBERS) {
                buttons[i].flags = TEXT_MARKUP;
            }
        }

        widget->redraw = 1;
        list_contents = -1;
    }

    if (!widget->redraw) {
        widget->redraw = list_need_redraw(list_party);
    }

    if (!widget->redraw) {
        for (i = 0; i < BUTTON_NUM; i++) {
            if (button_need_redraw(&buttons[i])) {
                widget->redraw = 1;
                break;
            }
        }
    }
}
Пример #5
0
/**
 * Handle SDL event for a button.
 * @param button
 * Button to handle.
 * @param event
 * The event.
 * @return
 * 1 if the event makes the button pressed, 0 otherwise.
 */
int button_event(button_struct *button, SDL_Event *event)
{
    SDL_Surface *texture;
    int old_mouse_over;

    if (event->type != SDL_MOUSEBUTTONUP && event->type != SDL_MOUSEBUTTONDOWN && event->type != SDL_MOUSEMOTION) {
        return 0;
    }

    /* Mouse button is released, the button is no longer being pressed. */
    if (event->type == SDL_MOUSEBUTTONUP) {
        button->pressed = 0;
        button->redraw = 1;
        return 0;
    }

    old_mouse_over = button->mouse_over;
    /* Always reset this. */
    button->mouse_over = 0;

    /* The button is disabled, we don't care about the mouse. */
    if (button->disabled) {
        return 0;
    }

    texture = texture_surface(button_determine_texture(button));

    if (BUTTON_MOUSE_OVER(button, event->motion.x, event->motion.y, texture)) {
        if (event->type == SDL_MOUSEMOTION) {
            cursor_texture = texture_get(TEXTURE_TYPE_CLIENT, "cursor_pointer");
        }

        /* Left mouse click, the button has been pressed. */
        if (event->type == SDL_MOUSEBUTTONDOWN && event->button.button == SDL_BUTTON_LEFT) {
            button->pressed = 1;
            button->pressed_ticks = SDL_GetTicks();
            button->pressed_repeat_ticks = 750;
            button->redraw = 1;
            return 1;
        } else {
            button->mouse_over = 1;

            /* Do not reset hover ticks if the previous state was already
             * in highlight mode. */
            if (!old_mouse_over) {
                button->hover_ticks = SDL_GetTicks();
            }
        }
    }

    if (old_mouse_over != button->mouse_over) {
        button->redraw = 1;
    }

    return 0;
}
Пример #6
0
/**
 * Initialize one mplayer widget.
 */
void widget_mplayer_init(widgetdata *widget)
{
    widget->draw_func = widget_draw;
    widget->background_func = widget_background;
    widget->event_func = widget_event;
    widget->deinit_func = widget_deinit;

    for (size_t i = 0; i < BUTTON_NUM; i++) {
        button_create(&buttons[i]);

        if (i == BUTTON_BLACKLIST || i == BUTTON_HELP || i == BUTTON_CLOSE) {
            buttons[i].texture = texture_get(TEXTURE_TYPE_CLIENT,
                    "button_round");
            buttons[i].texture_pressed = texture_get(TEXTURE_TYPE_CLIENT,
                    "button_round_down");
            buttons[i].texture_over = texture_get(TEXTURE_TYPE_CLIENT,
                    "button_round_over");
        }
    }
}
Пример #7
0
/**
 * Initialize a button's default values.
 * @param button
 * Button.
 */
void button_create(button_struct *button)
{
    memset(button, 0, sizeof(*button));

    /* Initialize default values. */
    button->surface = ScreenSurface;
    button->x = button->y = 0;
    button->texture = texture_get(TEXTURE_TYPE_CLIENT, "button");
    button->texture_pressed = texture_get(TEXTURE_TYPE_CLIENT, "button_down");
    button->texture_over = texture_get(TEXTURE_TYPE_CLIENT, "button_over");
    button->flags = 0;
    button->center = 1;
    button->color = COLOR_WHITE;
    button->color_shadow = COLOR_BLACK;
    button->color_over = COLOR_HGOLD;
    button->color_over_shadow = COLOR_BLACK;
    button->mouse_over = button->pressed = button->pressed_forced = button->disabled = 0;
    button->pressed_ticks = button->hover_ticks = button->pressed_repeat_ticks = 0;
    button->repeat_func = NULL;

    button_set_font(button, FONT_ARIAL10);
}
Пример #8
0
/**
 * Redraw the book GUI.
 */
void book_redraw(void)
{
    if (popup_get_head() && popup_get_head()->texture == texture_get(TEXTURE_TYPE_CLIENT, "book")) {
        popup_get_head()->redraw = 1;
    }
}
Пример #9
0
/**
 * Load the book interface.
 * @param data
 * Book's content.
 * @param len
 * Length of 'data'.
 */
void book_load(const char *data, int len)
{
    SDL_Rect box;
    int pos;

    /* Nothing to do. */
    if (!data || !len) {
        return;
    }

    /* Free old book data and reset the values. */
    if (book_content != NULL) {
        efree(book_content);
    }

    book_lines = 0;
    book_scroll_lines = 0;
    book_scroll = 0;

    /* Store the data. */
    book_content = estrdup(data);
    book_name_change("Book", 4);

    /* Strip trailing newlines. */
    for (pos = len - 1; pos >= 0; pos--) {
        if (book_content[pos] != '\n') {
            break;
        }

        book_content[pos] = '\0';
    }

    /* No data... */
    if (book_content[0] == '\0') {
        return;
    }

    /* Calculate the line numbers. */
    box.w = BOOK_TEXT_WIDTH;
    box.h = BOOK_TEXT_HEIGHT;
    text_show(NULL, FONT_ARIAL11, book_content, BOOK_TEXT_STARTX, BOOK_TEXT_STARTY, COLOR_WHITE, TEXT_WORD_WRAP | TEXT_MARKUP | TEXT_LINES_CALC, &box);
    book_lines = box.h;
    book_scroll_lines = box.y;

    /* Create the book popup if it doesn't exist yet. */
    if (!popup_get_head() || popup_get_head()->texture != texture_get(TEXTURE_TYPE_CLIENT, "book")) {
        popup_struct *popup;

        popup = popup_create(texture_get(TEXTURE_TYPE_CLIENT, "book"));
        popup->draw_func = popup_draw_func;
        popup->draw_post_func = popup_draw_post_func;
        popup->event_func = popup_event_func;
        popup->destroy_callback_func = popup_destroy_callback;
        popup->clipboard_copy_func = popup_clipboard_copy_func;
        popup->disable_texture_drawing = 1;

        popup->button_left.x = 25;
        popup->button_left.y = 25;

        if (book_help_history_enabled) {
            popup->button_left.event_func = popup_button_event_func;
            popup_button_set_text(&popup->button_left, "<");
        }

        popup->button_right.x = 649;
        popup->button_right.y = 25;
    }

    scrollbar_create(&scrollbar, BOOK_SCROLLBAR_WIDTH, BOOK_SCROLLBAR_HEIGHT, &book_scroll, &book_lines, book_scroll_lines);
    scrollbar.redraw = &popup_get_head()->redraw;

    popup_get_head()->redraw = 1;
}
Пример #10
0
Texture *texture_cubemap_with_name_new(const char *name, const char *paths[6])
{
    Texture *tex;
    tex = texture_get(name);

    if(tex != NULL)
    {
        puts("s");
        return tex;
    }

    if(render.num_textures >= MAX_TEXTURES)
        return NULL;

    /** Alloc the new texture **/
    tex = malloc( sizeof(Texture) );
    memset(tex, 0, sizeof(Texture) );
    tex->number_of_rows = 1;
    tex->type = GL_TEXTURE_CUBE_MAP;

    glGenTextures(1, &tex->tex_id);
    glBindTexture(GL_TEXTURE_CUBE_MAP, tex->tex_id);

    SDL_Surface *data;

    int i;
    for(i = 0; i < 6; i++)
    {
        data = IMG_Load(paths[i]);

        if(data == NULL)
            Util_FatalError("Texture %s could not be found!\n", paths[i]);

        SDL_LockSurface(data);
        /** All the textures sides are linearly stored so we just add "i" **/
        glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGBA,
                     data->w, data->h, GL_FALSE, GL_RGBA, GL_UNSIGNED_BYTE, data->pixels);

        SDL_UnlockSurface(data);
        SDL_FreeSurface(data);
    }

    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

    glBindTexture(GL_TEXTURE_CUBE_MAP, 0);

    /** Register inside the resource manager **/
    unsigned int hash_ = Util_Hash( name );
    hash_ %= MAX_HASH_TEXTURES;

    render.textures[render.num_textures] = tex;
    render.num_textures += 1;

    strcpy(tex->_name, name);
    tex->_hash_next = texture_hash_table[hash_];
    texture_hash_table[hash_] = tex;

    tex->hash_ = hash_;

    /** Return the final result **/
    return tex;
}
Пример #11
0
/**
 * Poll input device like mouse, keys, etc.
 * @return
 * 1 if the the quit key was pressed, 0 otherwise
 */
int Event_PollInputDevice(void)
{
    SDL_Event event;
    int x, y, done = 0;
    static Uint32 Ticks = 0;
    SDLKey key;

    /* Execute mouse actions, even if mouse button is being held. */
    if ((SDL_GetTicks() - Ticks > 125) || !Ticks) {
        if (cpl.state >= ST_PLAY) {
            /* Mouse gesture: hold right+left buttons or middle button
             * to fire. */
            if (widget_mouse_event.owner == cur_widget[MAP_ID]) {
                if (map_mouse_fire()) {
                    Ticks = SDL_GetTicks();
                }
            }
        }
    }

    while (SDL_PollEvent(&event)) {
        x = event.motion.x;
        y = event.motion.y;

        if (event.type == SDL_KEYDOWN) {
            if (!keys[event.key.keysym.sym].pressed) {
                keys[event.key.keysym.sym].repeated = 0;
                keys[event.key.keysym.sym].pressed = 1;
                keys[event.key.keysym.sym].time = LastTick + KEY_REPEAT_TIME_INIT;
            }
        } else if (event.type == SDL_KEYUP) {
            keys[event.key.keysym.sym].pressed = 0;
        } else if (event.type == SDL_MOUSEMOTION) {
            tooltip_dismiss();
        }

        if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_PRINT) {
            screenshot_create(ScreenSurface);
            continue;
        }

        switch (event.type) {
            /* Screen has been resized, update screen size. */
        case SDL_VIDEORESIZE:
            ScreenSurface = SDL_SetVideoMode(event.resize.w, event.resize.h, video_get_bpp(), get_video_flags());

            if (!ScreenSurface) {
                LOG(ERROR, "Unable to grab surface after resize event: %s", SDL_GetError());
                exit(1);
            }

            /* Set resolution to custom. */
            setting_set_int(OPT_CAT_CLIENT, OPT_RESOLUTION, 0);
            resize_window(event.resize.w, event.resize.h);
            break;

        case SDL_MOUSEBUTTONDOWN:
        case SDL_MOUSEBUTTONUP:
        case SDL_MOUSEMOTION:
        case SDL_KEYUP:
        case SDL_KEYDOWN:

            if (event.type == SDL_MOUSEMOTION) {
                cursor_x = x;
                cursor_y = y;
                cursor_texture = texture_get(TEXTURE_TYPE_CLIENT, "cursor_default");
            }

            if (popup_handle_event(&event)) {
                break;
            }

            if (event_dragging_check() && event.type != SDL_MOUSEBUTTONUP) {
                break;
            }

            if (cpl.state <= ST_WAITFORPLAY && intro_event(&event)) {
                break;
            } else if (cpl.state == ST_PLAY && widgets_event(&event)) {
                break;
            }

            if (cpl.state == ST_PLAY && (event.type == SDL_KEYDOWN || event.type == SDL_KEYUP)) {
                key_handle_event(&event.key);
                break;
            }

            break;

        case SDL_QUIT:
            done = 1;
            break;

        default:
            break;
        }

        if (event.type == SDL_MOUSEBUTTONUP) {
            event_dragging_stop_internal();
        }
    }

    for (key = 0; key < SDLK_LAST; key++) {
        /* Ignore modifier keys. */
        if (KEY_IS_MODIFIER(key)) {
            continue;
        }

        if (keys[key].pressed && keys[key].time + KEY_REPEAT_TIME - 5 < LastTick) {
            keys[key].time = LastTick + KEY_REPEAT_TIME - 5;
            keys[key].repeated = 1;
            event_push_key(SDL_KEYDOWN, key, SDL_GetModState());
        }
    }

    return done;
}