/** @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], "?"); } }
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); }
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; }
/** @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; } } } }
/** * 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; }
/** * 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"); } } }
/** * 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); }
/** * 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; } }
/** * 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; }
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; }
/** * 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; }