Files
minecraft-pe-0.6.1/src/client/gui/components/ItemPane.cpp
2026-03-02 22:04:18 +03:00

149 lines
4.9 KiB
C++
Executable File

#include "ItemPane.h"
#include "../Gui.h"
#include "../../renderer/gles.h"
#include "../../renderer/Tesselator.h"
#include "NinePatch.h"
#include "../../renderer/entity/ItemRenderer.h"
const int rgbActive = 0xfff0f0f0;
const int rgbInactive = 0xc0635558;
const int rgbInactiveShadow = 0xc0aaaaaa;
ItemPane::ItemPane( IItemPaneCallback* screen,
Textures* textures,
const IntRectangle& rect,
int numItems,
int guiHeight,
int physicalScreenHeight,
bool isVertical /*= true*/)
: super(
(isVertical?SF_LockX:SF_LockY)/*|SF_Scissor*/|SF_ShowScrollbar,
rect, // Pane rect
isVertical?IntRectangle(0, 0, rect.w, 22) // Item rect if vertical
:IntRectangle(0, 0, 32, rect.h), // Item rect if horizontal
isVertical?1:numItems, numItems, Gui::GuiScale),
screen(screen),
textures(textures),
physicalScreenHeight(physicalScreenHeight),
guiSlotItem(NULL),
guiSlotItemSelected(NULL),
isVertical(isVertical)
{
// Expand the area to make it easier to scroll
area._x0 -= 4;
area._x1 += 4;
area._y0 = 0;
area._y1 = (float)guiHeight;
// GUI
NinePatchFactory builder(textures, "gui/spritesheet.png");
guiSlotItem = builder.createSymmetrical(IntRectangle(20, 32, 8, 8), 2, 2);
guiSlotItemSelected = builder.createSymmetrical(IntRectangle(28, 32, 8, 8), 2, 2);
guiSlotItem->setSize((float)rect.w + 4, 22);
guiSlotItemSelected->setSize((float)rect.w + 4, 22);
}
ItemPane::~ItemPane() {
delete guiSlotItem;
delete guiSlotItemSelected;
}
void ItemPane::renderBatch( std::vector<GridItem>& items, float alpha )
{
//fill(bbox.x, bbox.y, bbox.x + bbox.w, bbox.y + bbox.h, 0xff666666);
const std::vector<CItem*>& cat = screen->getItems(this);
if (cat.empty()) return;
glEnable2(GL_SCISSOR_TEST);
GLuint x = (GLuint)(screenScale * bbox.x);
GLuint y = physicalScreenHeight - (GLuint)(screenScale * (bbox.y + bbox.h));
GLuint w = (GLuint)(screenScale * bbox.w);
GLuint h = (GLuint)(screenScale * bbox.h);
glScissor(x, y, w, h);
Tesselator& t = Tesselator::instance;
t.beginOverride();
for (unsigned int i = 0; i < items.size(); ++i) {
GridItem& item = items[i];
(item.selected? guiSlotItemSelected : guiSlotItem)->draw(t, Gui::floorAlignToScreenPixel(item.xf-1), Gui::floorAlignToScreenPixel(item.yf));
}
t.endOverrideAndDraw();
t.beginOverride();
for (unsigned int i = 0; i < items.size(); ++i) {
GridItem& item = items[i];
CItem* citem = cat[item.id];
ItemRenderer::renderGuiItem(NULL, textures, &citem->item,
Gui::floorAlignToScreenPixel(item.xf + itemBbox.w - 16),
Gui::floorAlignToScreenPixel(2 + item.yf), 16, 16, false);
}
t.endOverrideAndDraw();
t.beginOverride();
for (unsigned int i = 0; i < items.size(); ++i) {
GridItem& item = items[i];
CItem* citem = cat[item.id];
char buf[64] = {0};
int c = Gui::itemCountItoa(buf, citem->inventoryCount);
float xf = item.xf - 1;
if (citem->canCraft()) {
f->drawShadow(citem->text,
Gui::floorAlignToScreenPixel(xf + 2),
Gui::floorAlignToScreenPixel(item.yf + 6), rgbActive);
t.scale2d(0.6667f, 0.6667f);
f->drawShadow(buf,
Gui::floorAlignToScreenPixel(1.5f * (xf + itemBbox.w - c*4)),
Gui::floorAlignToScreenPixel(1.5f * (item.yf + itemBbox.h - 8)), rgbActive);
t.resetScale();
} else {
f->draw(citem->text,
Gui::floorAlignToScreenPixel(xf + 3),
Gui::floorAlignToScreenPixel(item.yf + 7), rgbInactiveShadow);
f->draw(citem->text,
Gui::floorAlignToScreenPixel(xf + 2),
Gui::floorAlignToScreenPixel(item.yf + 6), rgbInactive);
t.scale2d(0.6667f, 0.6667f);
f->draw(buf,
Gui::floorAlignToScreenPixel(1.5f * (xf + itemBbox.w - c*4)),
Gui::floorAlignToScreenPixel(1.5f * (item.yf + itemBbox.h - 8)), rgbInactive);
t.resetScale();
}
}
t.endOverrideAndDraw();
//fillGradient(bbox.x, bbox.y, bbox.x + bbox.w, 20, 0x00000000, 0x80ff0000)
if (isVertical) {
fillGradient(bbox.x, bbox.y, bbox.x + bbox.w, bbox.y + 28, 0xbb000000, 0x00000000);
fillGradient(bbox.x, bbox.y + bbox.h - 28, bbox.x + bbox.w, bbox.y + bbox.h, 0x00000000, 0xbb000000);//0xbb2A272B);
} else {
fillHorizontalGradient(bbox.x, bbox.y, bbox.x + 28, bbox.y + bbox.h, 0xbb000000, 0x00000000);
fillHorizontalGradient(bbox.x + bbox.w - 28, bbox.y, bbox.x + bbox.w, bbox.y + bbox.h, 0x00000000, 0xbb000000);//0xbb2A272B);
}
//LOGI("scroll: %f - %f, %f :: %f, %f\n", hScroll.alpha, hScroll.x, hScroll.y, hScroll.w, hScroll.h);
glDisable2(GL_SCISSOR_TEST);
drawScrollBar(hScroll);
drawScrollBar(vScroll);
}
bool ItemPane::onSelect( int gridId, bool selected )
{
if (selected)
screen->onItemSelected(this, gridId);
return selected;
}
void ItemPane::drawScrollBar( ScrollBar& sb ) {
if (sb.alpha <= 0)
return;
int color = ((int)(255.0f * sb.alpha) << 24) | 0xffffff;
fill(2 + sb.x, sb.y, 2 + sb.x + sb.w, sb.y + sb.h, color);
}