Как поменять объем контейнера ( сундука ) в ГУИ?

Версия Minecraft
1.7.10
14
1
Если увеличивать количество "слотов" в классе GUI и менять картинку (текстуру), картинка (320х320) скейлится с чересчур мелкой сеткой для слотов. Слоты просто "не влезают" в картинку бэкграунда контейнера.
Вот картинка ГУИ сундука, 320 х 320. Это вычисленный размер (16<слотов> * 18<размер-слота> + 15<перемычек> + 12<две-боковые-рамки>).
Но несмотря на то, что в типе сундука меняется xSize (320) и ySize (320) и бэкграунд должен был бы рендериться один в один, изображение частично дублируется, и слоты не совпадают с сеткой.

(светлый прямоугольник — это собственно слот)....


2021-04-11_13.17.01.png

Мозги сломала, где рендерится бэкграунд гуишного контейнера? Как убрать scale картинки фона?
При том, что нормальный дефолтный фон рендерится без скейлинга

2021-04-11_13.21.10.png


package ru.AykaOwl.storagemod.gui;

import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.IInventory;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.opengl.GL11;
import ru.AykaOwl.storagemod.container.ContainerOwlChest;
import ru.AykaOwl.storagemod.tile.TileEntityOwlChest;
import ru.AykaOwl.storagemod.utils.OwlChestType;

public class GUIStorage extends GuiContainer
{
private GUIStorage.GUIChest type;
private InventoryPlayer inventory;
private IInventory chest;

public int getRowLength() {
return this.type.mainType.getRowLength();
}

private GUIStorage(GUIStorage.GUIChest type, IInventory player, IInventory chest) {
super(type.makeContainer(player, chest));
this.chest = chest;
this.type = type;
this.xSize = type.xSize;
this.ySize = type.ySize;
this.allowUserInput = true;
}

protected void drawGuiContainerBackgroundLayer(float f, int i, int j) {
GL11.glColor4f(9.0F, 9.0F, 9.0F, 1.0F);

this.mc.getTextureManager().bindTexture(this.type.guiResourceList.location);
int x = (this.width - this.xSize) / 2;
int y = (this.height - this.ySize) / 2;
System.out.println("this.width : " + this.width);
drawTexturedModalRect(x, y, 0, 0, this.xSize, this.ySize);
}

public enum GUIChest {
SIMPLEOWL(184, 202, GUIStorage.ResourceList.SIMPLEOWL, OwlChestType.SIMPLEOWL),
WHITEOWL(320, 256, GUIStorage.ResourceList.WHITEOWL, OwlChestType.WHITEOWL);


private int xSize;

private int ySize;
private GUIStorage.ResourceList guiResourceList;
public OwlChestType mainType;

GUIChest(int xSize, int ySize, GUIStorage.ResourceList guiResourceList, OwlChestType mainType) {
this.xSize = xSize;
this.ySize = ySize;
this.guiResourceList = guiResourceList;
this.mainType = mainType;
}

protected Container makeContainer(IInventory player, IInventory chest) {
return new ContainerOwlChest(player, chest, this.mainType, this.xSize, this.ySize);
}

public static GUIStorage buildGUI(OwlChestType type, IInventory playerInventory, TileEntityOwlChest chestInventory) {
return new GUIStorage(values()[chestInventory.getType().ordinal()], playerInventory, chestInventory);
}
}

public enum ResourceList
{
SIMPLEOWL(new ResourceLocation("storagemod", "textures/gui/owlcontainer.png")),
WHITEOWL(new ResourceLocation("storagemod", "textures/gui/whiteowlcontainer.png"));

ResourceList(ResourceLocation loc) {
this.location = loc;
}
public final ResourceLocation location;
}

}
 
Последнее редактирование:
Решение
Не, соседний метод:
1618234668400.png
Аргументы по порядку: позиция x, позиция y, u, v, ширина интерфейса в текстуре, высота интерфейса в текстуре, ширина вообще всего изображения, высота вообще всего избражения.
1,560
86
204
Дело в том, что максимальное разрешение текстуры для интерфейсов ровна 256x256. Чтобы обойти это ограничения, логично, что надо использовать несколько текстур для дальнейшего объединения.
 
14
1
MaximPixel, спасибо за ответ! В принципе, я понимаю это, но ведь есть же какие-то классы, где можно это изменить? Это же не свойство архитектуры компьютера?
Есть, скажем, драконовый сундук из мода DraconicEvolution

2021-04-12_02.51.41.png

Действительно, он состоит из двух структур, которые объединяются

DraconicChestLeft.png DraconicChestRight.png

Однако, в аддоне Avaritiaddons для мода Avaritia есть сжатый сундук,

2021-04-12_02.52.08.png

у которого есть вот такое изображение интерфейса:

avaritiaddonsChest.png
И это не 256х256, а 500х500.
Значит, есть какие-то классы и параметры, которые все-таки регулируют разрешение (а вернее, размер) текстуры?
И тем более, есть какой-то механизм, который масштабирует (и не масштабирует) текстуру интерфейса контейнеров?

Вот, например, в Dire Autocrafting Table из того же аддона (352х352) рендер же не масштабирует сетку интерфейса и слоты совпадают?

dire_autocrafting_gui.png
Конечно, наиболее профессиональный ответ напрашивается немедленно: "хз... ищи сама!" :sneaky:
Но, может быть, хотя бы вместе? 😇
Наверняка это может быть интересно многим!
 
Последнее редактирование:

tox1cozZ

aka Agravaine
8,456
598
2,893
Ты рисуешь текстуру с помощью drawTexturedModalRect. У него указано что текстура должна быть строго 256 на 256.
В классе Gui или GuiScreen есть такой же метод, но с аргументами размера текстуры.
 
14
1
tox1cozZ спасибо большое!
Выяснилось, что хотя этот метод все равно не воспринимает аргумент с размерами текстуры, потому что 256рх там вшиты в код:
float f = 0.00390625F; // (1/256)
float f1 = 0.00390625F; // (1/256),
но метод можно переписать в виде
float f4 = 1.0F / sizeTextureX;
float f5 = 1.0F / sizeTextureY;
и тогда он будет реагировать на аргументы.

А вот способ HD Gui у меня не работает — интерфейс создается правильно, но текстура не подгружается.
 
14
1
Да, именно этот — func_152125_a(). Но текстуру не грузит.
Скорее всего, я просто напортачила с u, v, xSizeForU и xSizeForV (u и v всюду по нулям, а xSizeForU и xSizeForV — размеры интерфейса внутри текстуры?).
 
Последнее редактирование:

tox1cozZ

aka Agravaine
8,456
598
2,893
Не, соседний метод:
1618234668400.png
Аргументы по порядку: позиция x, позиция y, u, v, ширина интерфейса в текстуре, высота интерфейса в текстуре, ширина вообще всего изображения, высота вообще всего избражения.
 
Сверху