the whole game
This commit is contained in:
206
src/client/gui/components/InventoryPane.cpp
Executable file
206
src/client/gui/components/InventoryPane.cpp
Executable file
@@ -0,0 +1,206 @@
|
||||
#include "InventoryPane.h"
|
||||
#include "../Gui.h"
|
||||
#include "../../Minecraft.h"
|
||||
#include "../../player/input/touchscreen/TouchAreaModel.h"
|
||||
#include "../../renderer/entity/ItemRenderer.h"
|
||||
#include "../../renderer/Tesselator.h"
|
||||
#include "../../renderer/Textures.h"
|
||||
#include "../../../world/item/ItemInstance.h"
|
||||
#include "../../../world/entity/player/Inventory.h"
|
||||
|
||||
namespace Touch {
|
||||
|
||||
static const int By = 6; // Border Frame height
|
||||
|
||||
InventoryPane::InventoryPane( IInventoryPaneCallback* screen, Minecraft* mc, const IntRectangle& rect, int paneWidth, float clickMarginH, int numItems, int itemSize, int itemBorderSize)
|
||||
: screen(screen),
|
||||
mc(mc),
|
||||
paneWidth(paneWidth),
|
||||
rect(rect),
|
||||
super(
|
||||
SF_LockX|/*SF_Scissor|*/SF_ShowScrollbar|SF_NoHoldSelect,
|
||||
rect, // Pane rect
|
||||
IntRectangle(0, 0, itemSize, itemSize), // Item rect
|
||||
0, numItems, Gui::GuiScale),
|
||||
BorderPixels(itemBorderSize),
|
||||
lastItemIndex(-1),
|
||||
lastItemTicks(-1),
|
||||
fillMarginX(2),
|
||||
fillMarginY(4),
|
||||
markerType(1),
|
||||
markerIndex(-1),
|
||||
markerShare(0),
|
||||
renderDecorations(true)
|
||||
{
|
||||
_clickArea = new RectangleArea(0, 0, 0, 0);
|
||||
area._x0 = rect.x - clickMarginH;
|
||||
area._x1 = rect.x + rect.w + clickMarginH;
|
||||
area._y0 -= By;
|
||||
area._y1 += By;
|
||||
|
||||
/*
|
||||
const int left = bbox.x + (bbox.w - paneWidth) / 2;
|
||||
bg.x = left;
|
||||
bg.w = left + paneWidth; // @note: read as x1, not width
|
||||
bg.y = bbox.y - fillMarginY;
|
||||
bg.h = bbox.y + bbox.h + fillMarginY; // @note: read as y1, not width
|
||||
*/
|
||||
}
|
||||
|
||||
InventoryPane::~InventoryPane() {
|
||||
delete _clickArea;
|
||||
}
|
||||
|
||||
void InventoryPane::renderBatch( std::vector<GridItem>& items, float alpha )
|
||||
{
|
||||
//fill(bg.x, bg.y, bg.w, bg.h, 0xff333333);
|
||||
fill((float)(bbox.x-fillMarginX-1), (float)(bbox.y-fillMarginY), (float)(bbox.x + bbox.w + fillMarginX+1), (float)(bbox.y + bbox.h + fillMarginY), 0xff333333);
|
||||
//fill(0.0f, (float)(bbox.y-fillMarginY), 400.0f, (float)(bbox.y + bbox.h + fillMarginY), 0xff333333);//(float)(bbox.x-fillMarginX), (float)(bbox.y-fillMarginY), (float)(bbox.x + bbox.w + fillMarginX), (float)(bbox.y + bbox.h + fillMarginY), 0xff333333);
|
||||
glEnable2(GL_BLEND);
|
||||
glDisable2(GL_ALPHA_TEST);
|
||||
std::vector<const ItemInstance*> inventoryItems = screen->getItems(this);
|
||||
|
||||
glEnable2(GL_SCISSOR_TEST);
|
||||
GLuint x = (GLuint)(screenScale * bbox.x);
|
||||
GLuint y = mc->height - (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();
|
||||
t.colorABGR(0xffffffff);
|
||||
for (unsigned int i = 0; i < items.size(); ++i) {
|
||||
GridItem& item = items[i];
|
||||
blit(item.xf, item.yf, 200, 46, (float)itemBbox.w, (float)itemBbox.h, 16, 16);
|
||||
}
|
||||
mc->textures->loadAndBindTexture("gui/gui.png");
|
||||
t.endOverrideAndDraw();
|
||||
|
||||
GridItem* marked = NULL;
|
||||
float mxx, myy;
|
||||
|
||||
t.beginOverride();
|
||||
for (unsigned int i = 0; i < items.size(); ++i) {
|
||||
GridItem& item = items[i];
|
||||
int j = item.id;
|
||||
const ItemInstance* citem = inventoryItems[j];
|
||||
if (!citem) continue;
|
||||
|
||||
bool allowed = true;
|
||||
|
||||
t.enableColor();
|
||||
//#ifdef DEMO_MODE //@huge @attn
|
||||
if (!screen->isAllowed(j)) { allowed = false; t.color( 64, 64, 64); }
|
||||
else
|
||||
//#endif
|
||||
if (lastItemTicks > 0 && lastItemIndex == j) {
|
||||
int gv = 255 - lastItemTicks * 15;
|
||||
t.color(gv, gv, gv, (allowed && citem->count <= 0)?0x60:0xff);
|
||||
} else {
|
||||
t.color(255, 255, 255, (allowed && citem->count <= 0)?0x60:0xff);
|
||||
}
|
||||
t.noColor();
|
||||
float xx = Gui::floorAlignToScreenPixel(item.xf + BorderPixels + 4);
|
||||
float yy = Gui::floorAlignToScreenPixel(item.yf + BorderPixels + 4);
|
||||
ItemRenderer::renderGuiItem(NULL, mc->textures, citem, xx, yy, 16, 16, false);
|
||||
|
||||
if (j == markerIndex && markerShare >= 0)
|
||||
marked = &item, mxx = xx, myy = yy;
|
||||
|
||||
}
|
||||
t.endOverrideAndDraw();
|
||||
|
||||
if (marked) {
|
||||
glDisable2(GL_TEXTURE_2D);
|
||||
const float yy0 = myy - 5.0f;
|
||||
const float yy1 = yy0 + 2;
|
||||
fill(mxx, yy0, mxx + 16.0f, yy1, 0xff606060);
|
||||
fill(mxx, yy0, mxx + markerShare * 16.0f, yy1, markerType==1?0xff00ff00:0xff476543);
|
||||
glEnable2(GL_BLEND);
|
||||
glEnable2(GL_TEXTURE_2D);
|
||||
}
|
||||
|
||||
|
||||
if (!mc->isCreativeMode()) {
|
||||
const float ikText = Gui::InvGuiScale + Gui::InvGuiScale;
|
||||
const float kText = 0.5f * Gui::GuiScale;
|
||||
t.beginOverride();
|
||||
t.scale2d(ikText, ikText);
|
||||
for (unsigned int i = 0; i < items.size(); ++i) {
|
||||
GridItem& item = items[i];
|
||||
const ItemInstance* citem = inventoryItems[item.id];
|
||||
if (!citem) continue;
|
||||
|
||||
char buf[64] = {0};
|
||||
/*int c = */ Gui::itemCountItoa(buf, citem->count);
|
||||
|
||||
float tx = Gui::floorAlignToScreenPixel(kText * (item.xf + BorderPixels + 3));
|
||||
float ty = Gui::floorAlignToScreenPixel(kText * (item.yf + BorderPixels + 3));
|
||||
mc->gui.renderSlotText(citem, tx, ty, true, true);
|
||||
}
|
||||
t.resetScale();
|
||||
glEnable2(GL_BLEND);
|
||||
t.endOverrideAndDraw();
|
||||
}
|
||||
|
||||
if (renderDecorations) {
|
||||
t.beginOverride();
|
||||
for (unsigned int i = 0; i < items.size(); ++i) {
|
||||
GridItem& item = items[i];
|
||||
const ItemInstance* citem = inventoryItems[item.id];
|
||||
if (!citem || citem->isNull()) continue;
|
||||
|
||||
if (citem->isDamaged()) {
|
||||
ItemRenderer::renderGuiItemDecorations(citem, item.xf + 8, item.yf + 12);
|
||||
}
|
||||
}
|
||||
|
||||
glDisable2(GL_TEXTURE_2D);
|
||||
t.endOverrideAndDraw();
|
||||
glEnable2(GL_TEXTURE_2D);
|
||||
}
|
||||
glDisable2(GL_SCISSOR_TEST);
|
||||
|
||||
//fillGradient(bbox.x - 1, bbox.y, bbox.x + bbox.w + 1, bbox.y + 20, 0x99000000, 0x00000000);
|
||||
//fillGradient(bbox.x - 1, bbox.y + bbox.h - 20, bbox.x + bbox.w + 1, bbox.y + bbox.h, 0x00000000, 0x99000000);
|
||||
fillGradient(bg.x - fillMarginX, bbox.y, bg.w + fillMarginX, bbox.y + 20, 0x99000000, 0x00000000);
|
||||
fillGradient(bg.x - fillMarginX, bbox.y + bbox.h - 20, bg.w + fillMarginX, bbox.y + bbox.h, 0x00000000, 0x99000000);
|
||||
|
||||
drawScrollBar(hScroll);
|
||||
drawScrollBar(vScroll);
|
||||
}
|
||||
|
||||
bool InventoryPane::onSelect( int gridId, bool selected )
|
||||
{
|
||||
//screen->onItemSelected(gridId);
|
||||
if (screen->isAllowed(gridId))
|
||||
if (screen->addItem(this, gridId)) {
|
||||
lastItemIndex = gridId;
|
||||
lastItemTicks = 7;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void InventoryPane::drawScrollBar( ScrollBar& sb ) {
|
||||
if (sb.alpha <= 0)
|
||||
return;
|
||||
|
||||
const int color = ((int)(255.0f * sb.alpha) << 24) | 0xaaaaaa;
|
||||
const float xx = (float)(bbox.x + bbox.w);
|
||||
fill(xx - sb.w, sb.y, xx, sb.y + sb.h, color);
|
||||
}
|
||||
|
||||
void InventoryPane::tick()
|
||||
{
|
||||
--lastItemTicks;
|
||||
super::tick();
|
||||
}
|
||||
|
||||
void InventoryPane::setRenderDecorations( bool value ) {
|
||||
renderDecorations = value;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user