/** * @param atlas The texture atlas that is being used * @param atlasSize How many textures the atlas contains in it's width and height. * @param validTextures Indices of the valid textures */ public TextureOffsetGeneratorComponent(final Texture atlas, final Vector2i atlasSize, final Vector2i[] validTextures) { final float textureWidth = atlas.getWidth() / (float) atlasSize.getX(); final float textureHeight = atlas.getHeight() / (float) atlasSize.getY(); Function<Vector2i, Vector2f> absolute2Relative = (absolute) -> new Vector2f( absolute.getX() * textureWidth, absolute.getY() * textureHeight ); this.validOffsets = new LinkedList<>(); for (Vector2i offset : validTextures) { this.validOffsets.add(absolute2Relative.apply(offset)); } } }
rowSizes[i] = Math.max(rowSizes[i], columnInfo.widgetSizes.get(i).getY());
@Override public Vector2i getPreferredContentSize(Canvas canvas, Vector2i sizeHint) { int numSlots = getNumSlots(); if (numSlots == 0 || cells.isEmpty()) { return Vector2i.zero(); } Vector2i cellSize = canvas.calculatePreferredSize(cells.get(0)); if (cellSize.getX() == 0 || cellSize.getY() == 0) { return Vector2i.zero(); } int horizontalCells = Math.min(Math.min(maxHorizontalCells, numSlots), sizeHint.getX() / cellSize.getX()); int verticalCells = ((numSlots - 1) / horizontalCells) + 1; return new Vector2i(horizontalCells * cellSize.x, verticalCells * cellSize.y); }
@Override public void onDraw(Canvas canvas) { int numSlots = getNumSlots(); if (numSlots == 0 || cells.isEmpty()) { return; } Vector2i cellSize = canvas.calculatePreferredSize(cells.get(0)); if (cellSize.getX() == 0 || cellSize.getY() == 0) { return; } canvas.addInteractionRegion(interactionListener); int horizontalCells = Math.max(1, Math.min(maxHorizontalCells, canvas.size().getX() / cellSize.getX())); for (int i = 0; i < numSlots && i < cells.size(); ++i) { int horizPos = i % horizontalCells; int vertPos = i / horizontalCells; canvas.drawWidget(cells.get(i), Rect2i.createFromMinAndSize(horizPos * cellSize.x, vertPos * cellSize.y, cellSize.x, cellSize.y)); } }
for (ColumnInfo column : columnInfos) { for (int row = 0; row < column.widgetSizes.size(); row++) { minHeights[row] = Math.max(minHeights[row], column.widgetSizes.get(row).getY());
itemSize = preferredSize.getY(); canvasSize = canvas.size().y;
private float[] getSubset(float[] fullData, Rect2i fullRegion, Rect2i subRegion) { if (subRegion.size().x != fullRegion.size().x || subRegion.size().y != fullRegion.size().y) { float[] result = new float[subRegion.size().x * subRegion.size().y]; Vector2i offset = new Vector2i(subRegion.minX() - fullRegion.minX(), subRegion.minY() - fullRegion.minY()); for (int y = 0; y < subRegion.size().y; ++y) { System.arraycopy(fullData, offset.getX() + fullRegion.size().x * (y + offset.getY()), result, subRegion.size().x * y, subRegion.size().x); } return result; } else { return fullData; } }
private float[] getSubset(float[] fullData, Rect2i fullRegion, Rect2i subRegion) { if (subRegion.sizeX() != fullRegion.sizeX() || subRegion.sizeY() != fullRegion.sizeY()) { float[] result = new float[subRegion.sizeX() * subRegion.sizeY()]; Vector2i offset = new Vector2i(subRegion.minX() - fullRegion.minX(), subRegion.minY() - fullRegion.minY()); for (int y = 0; y < subRegion.sizeY(); ++y) { System.arraycopy(fullData, offset.getX() + fullRegion.sizeX() * (y + offset.getY()), result, subRegion.sizeX() * y, subRegion.sizeX()); } return result; } else { return fullData; } }