mirror of
https://gitea.sffempire.ru/Kolyah35/minecraft-pe-0.6.1.git
synced 2026-03-30 20:13:31 +00:00
149 lines
4.9 KiB
C++
Executable File
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);
|
|
}
|