int bp2d_insert(bp2d_node *node, const bp2d_size *in_size, bp2d_position *out_pos) { if (node->left != NULL || node->right != NULL) { int ret = bp2d_insert(node->left, in_size, out_pos); if (ret == 0) { return bp2d_insert(node->right, in_size, out_pos); } return ret; } else { if (node->filled) return 0; if (in_size->w > node->rect.w || in_size->h > node->rect.h) return 0; if (in_size->w == node->rect.w && in_size->h == node->rect.h) { out_pos->x = node->rect.x; out_pos->y = node->rect.y; node->filled = 1; return 1; } int dw = node->rect.w - in_size->w; int dh = node->rect.h - in_size->h; bp2d_rectangle left_rect, right_rect; if (dw > dh) { left_rect.x = node->rect.x; left_rect.y = node->rect.y; left_rect.w = in_size->w; left_rect.h = node->rect.h; right_rect.x = node->rect.x + in_size->w; right_rect.y = node->rect.y; right_rect.w = node->rect.w - in_size->w; right_rect.h = node->rect.h; } else { left_rect.x = node->rect.x; left_rect.y = node->rect.y; left_rect.w = node->rect.w; left_rect.h = in_size->h; right_rect.x = node->rect.x; right_rect.y = node->rect.y + in_size->h; right_rect.w = node->rect.w; right_rect.h = node->rect.h - in_size->h; } node->left = bp2d_create(&left_rect); node->right = bp2d_create(&right_rect); return bp2d_insert(node->left, in_size, out_pos); } }
texture_atlas *texture_atlas_create(int width, int height, SceGxmTextureFormat format) { texture_atlas *atlas = malloc(sizeof(*atlas)); if (!atlas) return NULL; bp2d_rectangle rect; rect.x = 0; rect.y = 0; rect.w = width; rect.h = height; atlas->tex = vita2d_create_empty_texture_format(width, height, format); atlas->bp_root = bp2d_create(&rect); atlas->htab = int_htab_create(256); return atlas; }