@Override public void apply(float v) { consumer.accept(Rect2i.createFromMinAndMax( // rounds towards zero (int) (v * (to.minX() - from.minX()) + from.minX()), (int) (v * (to.minY() - from.minY()) + from.minY()), (int) (v * (to.maxX() - from.maxX()) + from.maxX()), (int) (v * (to.maxY() - from.maxY()) + from.maxY()) )); } }
protected final int getRelativeIndex(int x, int z) { if (!relativeRegion.contains(x, z)) { throw new IllegalArgumentException(String.format("Out of bounds: (%d, %d) for region %s", x, z, relativeRegion.toString())); } return x - relativeRegion.minX() + relativeRegion.sizeX() * (z - relativeRegion.minY()); }
@Override public Rect2i getRegion() { return Rect2i.createFromMinAndSize(0, 0, state.drawRegion.width(), state.drawRegion.height()); }
if (!currentTextureCropRegion.equals(requestedCropRegion) && !(currentTextureCropRegion.contains(absoluteRegion) && requestedCropRegion.contains(absoluteRegion))) { textureMat.setFloat4(CROPPING_BOUNDARIES_PARAM, requestedCropRegion.minX(), requestedCropRegion.maxX(), requestedCropRegion.minY(), requestedCropRegion.maxY()); currentTextureCropRegion = requestedCropRegion; switch (mode) { case TILED: { TextureCacheKey key = new TextureCacheKey(texture.size(), absoluteRegion.size()); usedTextures.add(key); mesh = cachedTextures.get(key); absoluteRegion.minX(), absoluteRegion.minY()); textureMat.setFloat2("offset", absoluteRegion.minX(), absoluteRegion.minY()); textureMat.setFloat2("scale", absoluteRegion.width(), absoluteRegion.height()); float texBorderX = (scale.x - absoluteRegion.width()) / scale.x * uw; float texBorderY = (scale.y - absoluteRegion.height()) / scale.y * uh; textureMat.setFloat2("scale", scale); textureMat.setFloat2("offset", absoluteRegion.minX() + 0.5f * (absoluteRegion.width() - scale.x), absoluteRegion.minY() + 0.5f * (absoluteRegion.height() - scale.y));
public static LineCoordinates getLineCoordinates(int startX, int startY, int endX, int endY, Rect2i baseRegion, Rect2i cropRegion) { Rect2i region = Rect2i.createFromMinAndMax(Math.min(startX, endX), Math.min(startY, endY), Math.max(startX, endX), Math.max(startY, endY)); Rect2i absoluteRegion = relativeToAbsolute(region, baseRegion); Rect2i finalRegion = cropRegion.intersect(absoluteRegion); if (!finalRegion.isEmpty()) { int sx = startX > endX ? finalRegion.maxX() : finalRegion.minX(); int sy = startY > endY ? finalRegion.maxY() : finalRegion.minY(); int ex = startX > endX ? finalRegion.minX() : finalRegion.maxX(); int ey = startY > endY ? finalRegion.minY() : finalRegion.maxY(); return new LineCoordinates(new Vector2i(sx, sy), new Vector2i(ex, ey)); } else { return null; } }
private Rect2i applyStyleToSize(Rect2i region, UIStyle style) { if (region.isEmpty()) { return region; } Vector2i size = applyStyleToSize(region.size(), style); int minX = region.minX() + style.getHorizontalAlignment().getOffset(size.x, region.width()); int minY = region.minY() + style.getVerticalAlignment().getOffset(size.y, region.height()); return Rect2i.createFromMinAndSize(minX, minY, size.x, size.y); }
@Override public void drawText(String text, Font font, HorizontalAlign hAlign, VerticalAlign vAlign, Rect2i absoluteRegion, Color color, Color shadowColor, float alpha, boolean underlined) { TextCacheKey key = new TextCacheKey(text, font, absoluteRegion.width(), hAlign, color, shadowColor, underlined); usedText.add(key); Map<Material, Mesh> fontMesh = cachedText.get(key); List<String> lines = TextLineBuilder.getLines(font, text, absoluteRegion.width()); if (fontMesh != null) { for (Mesh mesh : fontMesh.values()) { if (mesh.isDisposed()) { fontMesh = null; break; } } } if (fontMesh == null) { fontMesh = fontMeshBuilder.createTextMesh(font, lines, absoluteRegion.width(), hAlign, color, shadowColor, underlined); cachedText.put(key, fontMesh); } Vector2i offset = new Vector2i(absoluteRegion.minX(), absoluteRegion.minY()); offset.y += vAlign.getOffset(lines.size() * font.getLineHeight(), absoluteRegion.height()); fontMesh.entrySet().stream().filter(entry -> entry.getKey().isRenderable()).forEach(entry -> { entry.getKey().bindTextures(); entry.getKey().setFloat4(CROPPING_BOUNDARIES_PARAM, requestedCropRegion.minX(), requestedCropRegion.maxX(), requestedCropRegion.minY(), requestedCropRegion.maxY()); entry.getKey().setFloat2("offset", offset.x, offset.y); entry.getKey().setFloat("alpha", alpha); entry.getValue().render(); }); }
@Override public void paintDebugCell(int x, int y, int width, int height) { debugRects.add(Rect2i.createFromMinAndSize(x, y, width, height)); }
@Override public void process(GeneratingRegion region) { SurfaceHeightFacet surfaceHeight = region.getRegionFacet(SurfaceHeightFacet.class); DensityFacet facet = new DensityFacet(region.getRegion(), region.getBorderForFacet(DensityFacet.class)); Region3i area = region.getRegion(); Rect2i rect = Rect2i.createFromMinAndMax(facet.getRelativeRegion().minX(), facet.getRelativeRegion().minZ(), facet.getRelativeRegion().maxX(), facet.getRelativeRegion().maxZ()); for (BaseVector2i pos : rect.contents()) { float height = surfaceHeight.get(pos); for (int y = facet.getRelativeRegion().minY(); y <= facet.getRelativeRegion().maxY(); ++y) { facet.set(pos.x(), y, pos.y(), height - area.minY() - y); } } region.setRegionFacet(DensityFacet.class, facet); } }
@Before public void setup() { cropRegion = Rect2i.createFromMinAndMax(10, 20, 30, 30); }
@Override public void render(Canvas canvas, Rect2i bounds, TextRenderStyle defaultRenderStyle) { TextRenderStyle safeRenderStyle = getTextRenderStyle(defaultRenderStyle); Font font = safeRenderStyle.getFont(hyperlink != null); int lineHeight = font.getLineHeight(); Rect2i bottomBounds = Rect2i.createFromMinAndSize(bounds.minX(), bounds.maxY() - lineHeight, bounds.sizeX(), lineHeight); canvas.drawTextRaw(text, font, safeRenderStyle.getColor(hyperlink != null), bottomBounds); }
public void onDraw(Canvas canvas) { Rect2i region = canvas.getRegion(); inputPort.updateRect(); canvas.drawWidget(inputPort, Rect2i.createFromMinAndMax( (int) (inputPort.rect.minX() / 10.f * region.width()), (int) (inputPort.rect.minY() / 5.f * region.height()), (int) (inputPort.rect.maxX() / 10.f * region.width()), (int) (inputPort.rect.maxY() / 5.f * region.height()))); for (Port port : ports) { port.updateRect(); canvas.drawWidget(port, Rect2i.createFromMinAndMax( (int) (port.rect.minX() / 10.f * region.width()), (int) (port.rect.minY() / 5.f * region.height()), (int) (port.rect.maxX() / 10.f * region.width()), (int) (port.rect.maxY() / 5.f * region.height()))); } }
@Override public void process(GeneratingRegion region) { SurfaceHeightFacet facet = new SurfaceHeightFacet(region.getRegion(), region.getBorderForFacet(SurfaceHeightFacet.class)); for (BaseVector2i pos : facet.getRelativeRegion().contents()) { facet.set(pos, height); } region.setRegionFacet(SurfaceHeightFacet.class, facet); } }
@Override public void process(GeneratingRegion region) { Region3i reg = region.getRegion(); Rect2i rc = Rect2i.createFromMinAndMax(reg.minX(), reg.minZ(), reg.maxX(), reg.maxZ()); if (rc.distanceSquared(centerPos.x(), centerPos.y()) <= outerRadius * outerRadius) { SurfaceHeightFacet facet = region.getRegionFacet(SurfaceHeightFacet.class); // update the surface height for (BaseVector2i pos : facet.getWorldRegion().contents()) { float originalValue = facet.getWorld(pos); int distSq = pos.distanceSquared(centerPos); if (distSq <= innerRadius * innerRadius) { facet.setWorld(pos, targetHeight); } else if (distSq <= outerRadius * outerRadius) { double dist = pos.distance(centerPos) - innerRadius; float norm = (float) dist / (outerRadius - innerRadius); facet.setWorld(pos, TeraMath.lerp(targetHeight, originalValue, norm)); } } } } }
@Override public void onDraw(Canvas canvas) { Rect2i clearButtonRegion = Rect2i.createFromMinAndSize(0, 0, 30, canvas.size().y); lastWidth = canvas.size().x - clearButtonRegion.size().x; if (isEnabled()) { canvas.addInteractionRegion(interactionListener, Rect2i.createFromMinAndMax(0, 0, canvas.size().x, canvas.size().y)); canvas.addInteractionRegion(clearInteractionListener, Rect2i.createFromMinAndMax(canvas.size().x, 0, canvas.size().x + clearButtonRegion.size().x, canvas.size().y)); } drawAll(canvas, canvas.size().x - clearButtonRegion.size().x); } }
@Override public Rect2i addRightFloat(int y, int width, int height) { int posY = y; while (true) { int availableWidth = getAvailableWidthAt(posY); if (availableWidth >= width) { int x = 0; Rect2i lastRight = findLastAtYPosition(rightFloats, posY); if (lastRight != null) { x = lastRight.minX(); } Rect2i floatRect = Rect2i.createFromMinAndSize(x - width, posY, width, height); rightFloats.add(floatRect); return floatRect; } else { Rect2i lastLeft = findLastAtYPosition(leftFloats, posY); Rect2i lastRight = findLastAtYPosition(rightFloats, posY); if (lastLeft != null && lastRight != null) { posY = Math.min(lastLeft.maxY(), lastRight.maxY()); } else if (lastLeft != null) { posY = lastLeft.maxY(); } else if (lastRight != null) { posY = lastRight.maxY(); } } } }
@Override public Rect2i addLeftFloat(int y, int width, int height) { int posY = y; while (true) { int availableWidth = getAvailableWidthAt(posY); if (availableWidth >= width) { int x = 0; Rect2i lastLeft = findLastAtYPosition(leftFloats, posY); if (lastLeft != null) { x = lastLeft.maxX(); } Rect2i floatRect = Rect2i.createFromMinAndSize(x, posY, width, height); leftFloats.add(floatRect); return floatRect; } else { Rect2i lastLeft = findLastAtYPosition(leftFloats, posY); Rect2i lastRight = findLastAtYPosition(rightFloats, posY); if (lastLeft != null && lastRight != null) { posY = Math.min(lastLeft.maxY(), lastRight.maxY()); } else if (lastLeft != null) { posY = lastLeft.maxY(); } else if (lastRight != null) { posY = lastRight.maxY(); } } } }
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; } }