#include "InventoryView.h" #include #include "BlocksPreview.h" #include "LevelFrontend.h" #include "../window/Events.h" #include "../assets/Assets.h" #include "../graphics/Shader.h" #include "../graphics/Batch2D.h" #include "../graphics/GfxContext.h" #include "../content/Content.h" #include "../maths/voxmaths.h" #include "../objects/Player.h" #include "../voxels/Block.h" InventoryView::InventoryView( int columns, const ContentIndices* indices, LevelFrontend* frontend, std::vector blocks) : indices(indices), blocks(blocks), frontend(frontend), columns(columns) { } InventoryView::~InventoryView() { } void InventoryView::setPosition(int x, int y) { position.x = x; position.y = y; } int InventoryView::getWidth() const { return columns * iconSize + (columns-1) * interval + padding.x * 2; } int InventoryView::getHeight() const { uint inv_rows = ceildiv(blocks.size(), columns); return inv_rows * iconSize + (inv_rows-1) * interval + padding.y * 2; } void InventoryView::setSlotConsumer(slotconsumer consumer) { this->consumer = consumer; } void InventoryView::actAndDraw(const GfxContext* ctx) { Assets* assets = frontend->getAssets(); Shader* uiShader = assets->getShader("ui"); auto viewport = ctx->getViewport(); uint inv_w = getWidth(); uint inv_h = getHeight(); int xs = position.x + padding.x; int ys = position.y + padding.y; glm::vec4 tint (1.0f); int mx = Events::cursor.x; int my = Events::cursor.y; // background auto batch = ctx->getBatch2D(); batch->texture(nullptr); batch->color = glm::vec4(0.0f, 0.0f, 0.0f, 0.5f); batch->rect(position.x, position.y, inv_w, inv_h); batch->render(); // blocks & items if (Events::scroll) { scroll -= Events::scroll * (iconSize+interval); } scroll = std::min(scroll, int(inv_h-viewport.getHeight())); scroll = std::max(scroll, 0); auto blocksPreview = frontend->getBlocksPreview(); blocksPreview->begin(&ctx->getViewport()); { Window::clearDepth(); GfxContext subctx = ctx->sub(); subctx.depthTest(true); subctx.cullFace(true); uint index = 0; for (uint i = 0; i < blocks.size(); i++) { Block* cblock = indices->getBlockDef(blocks[i]); int x = xs + (iconSize+interval) * (index % columns); int y = ys + (iconSize+interval) * (index / columns) - scroll; if (y < -int(iconSize+interval) || y >= int(viewport.getHeight())) { index++; continue; } if (mx > x && mx < x + (int)iconSize && my > y && my < y + (int)iconSize) { tint.r *= 1.2f; tint.g *= 1.2f; tint.b *= 1.2f; if (Events::jclicked(mousecode::BUTTON_1)) { if (consumer) { consumer(blocks[i]); } } } else { tint = glm::vec4(1.0f); } blocksPreview->draw(cblock, x, y, iconSize, tint); index++; } } uiShader->use(); }