use of org.terasology.math.geom.Rect2i in project Terasology by MovingBlocks.
the class ScrollableArea method layoutWithBothScrollbars.
private void layoutWithBothScrollbars(Canvas canvas, Vector2i contentSize, int fullWidth, int fullHeight, int scrollbarWidth, int scrollbarHeight) {
int availableWidth = fullWidth - scrollbarWidth;
int availableHeight = fullHeight - scrollbarHeight;
boolean atBottom = verticalBar.getRange() == verticalBar.getValue();
Rect2i contentRegion = Rect2i.createFromMinAndSize(0, 0, availableWidth, availableHeight);
verticalBar.setRange(contentSize.y - contentRegion.height());
horizontalBar.setRange(contentSize.x - contentRegion.width());
if ((stickToBottom && atBottom) || moveToBottomPending) {
verticalBar.setValue(verticalBar.getRange());
moveToBottomPending = false;
}
if (moveToTopPending) {
verticalBar.setValue(0);
moveToTopPending = false;
}
canvas.addInteractionRegion(scrollListener);
canvas.drawWidget(verticalBar, Rect2i.createFromMinAndSize(availableWidth, 0, scrollbarWidth, availableHeight));
canvas.drawWidget(horizontalBar, Rect2i.createFromMinAndSize(0, availableHeight, availableWidth, scrollbarHeight));
try (SubRegion ignored = canvas.subRegion(contentRegion, true)) {
canvas.drawWidget(content, Rect2i.createFromMinAndSize(-horizontalBar.getValue(), -verticalBar.getValue(), contentSize.x, contentSize.y));
}
}
use of org.terasology.math.geom.Rect2i in project Terasology by MovingBlocks.
the class IconMeshFactory method generateIconMeshData.
public static MeshData generateIconMeshData(TextureRegion tex, int alphaLimit, boolean withContour, Vector4f colorContour) {
ByteBuffer buffer = tex.getTexture().getData().getBuffers()[0];
Rect2i pixelRegion = tex.getPixelRegion();
int posX = pixelRegion.minX();
int posY = pixelRegion.minY();
int stride = tex.getTexture().getWidth() * 4;
float textureSize = Math.max(tex.getWidth(), tex.getHeight());
Tessellator tessellator = new Tessellator();
for (int y = 0; y < tex.getHeight(); y++) {
for (int x = 0; x < tex.getWidth(); x++) {
int r = buffer.get((posY + y) * stride + (posX + x) * 4) & 255;
int g = buffer.get((posY + y) * stride + (posX + x) * 4 + 1) & 255;
int b = buffer.get((posY + y) * stride + (posX + x) * 4 + 2) & 255;
int a = buffer.get((posY + y) * stride + (posX + x) * 4 + 3) & 255;
if (a > alphaLimit) {
Vector4f color = new Vector4f(r / 255f, g / 255f, b / 255f, a / 255f);
TessellatorHelper.addBlockMesh(tessellator, color, 2f / textureSize, 1.0f, 0.5f, 2f / textureSize * x - 1f, 2f / textureSize * (tex.getHeight() - y - 1) - 1f, 0f);
if (withContour) {
int newX = 0;
int newY = 0;
int newA = 0;
for (int i = 0; i < 4; i++) {
newA = alphaLimit + 1;
switch(i) {
case 0:
// check left
if (x > 0) {
newX = x - 1;
newY = y;
newA = buffer.get((posY + newY) * stride + (posX + newX) * 4 + 3) & 255;
}
break;
case 1:
// check top
if (y > 0) {
newX = x;
newY = y - 1;
newA = buffer.get((posY + newY) * stride + (posX + newX) * 4 + 3) & 255;
}
break;
case 2:
// check right
if (x < 16) {
newX = x + 1;
newY = y;
newA = buffer.get((posY + newY) * stride + (posX + newX) * 4 + 3) & 255;
}
break;
case 3:
// check bottom
if (y < 16) {
newX = x;
newY = y + 1;
newA = buffer.get((posY + newY) * stride + (posX + newX) * 4 + 3) & 255;
}
break;
default:
break;
}
if (newA < alphaLimit) {
Vector4f cColor = new Vector4f(colorContour.x / 255f, colorContour.y / 255f, colorContour.z / 255f, colorContour.w);
TessellatorHelper.addBlockMesh(tessellator, cColor, 0.125f, 1.0f, 0.5f, 2f * 0.0625f * newX - 0.5f, 0.125f * (15 - newY) - 1f, 0f);
}
}
}
}
}
}
return tessellator.generateMeshData();
}
use of org.terasology.math.geom.Rect2i in project Terasology by MovingBlocks.
the class ContextMenuScreen method onDraw.
@Override
public void onDraw(Canvas canvas) {
canvas.addInteractionRegion(mainListener);
Vector2i currentPosition = null;
int currentWidth = 0;
for (UIList<AbstractContextMenuItem> level : menuWidgets) {
if (level.isVisible()) {
if (currentPosition == null) {
currentPosition = new Vector2i(position);
} else {
currentPosition.addX(currentWidth);
}
Rect2i region = Rect2i.createFromMinAndSize(currentPosition, canvas.calculatePreferredSize(level));
double percentageThreshold = 0.9;
if (region.maxY() > canvas.getRegion().height() * percentageThreshold) {
region = Rect2i.createFromMinAndMax(region.minX(), region.minY() - (region.maxY() - canvas.getRegion().height()) - (int) (canvas.getRegion().height() * (1 - percentageThreshold)), region.maxX(), canvas.getRegion().height());
}
currentWidth = canvas.calculatePreferredSize(level).getX() - 8;
canvas.drawWidget(level, region);
}
}
}
use of org.terasology.math.geom.Rect2i in project Terasology by MovingBlocks.
the class CanvasImpl method addInteractionRegion.
@Override
public void addInteractionRegion(InteractionListener listener, UIWidget tooltip, Rect2i region) {
Vector2i offset = state.drawRegion.min();
Rect2i finalRegion = state.cropRegion.intersect(relativeToAbsolute(region));
if (!finalRegion.isEmpty()) {
listener.setFocusManager(nuiManager);
if (state.drawOnTop) {
drawOnTopOperations.add(new DrawInteractionRegionOperation(finalRegion, offset, listener, state.element, tooltip));
} else {
interactionRegions.addLast(new InteractionRegion(finalRegion, offset, listener, state.element, tooltip));
}
}
}
use of org.terasology.math.geom.Rect2i in project Terasology by MovingBlocks.
the class CanvasImpl method drawMesh.
@Override
public void drawMesh(Mesh mesh, Material material, Rect2i region, Quat4f rotation, Vector3f offset, float scale) {
if (material == null) {
logger.warn("Attempted to draw with nonexistent material");
return;
}
if (mesh == null) {
logger.warn("Attempted to draw nonexistent mesh");
return;
}
Rect2i drawRegion = relativeToAbsolute(region);
if (!state.cropRegion.overlaps(drawRegion)) {
return;
}
renderer.drawMesh(mesh, material, drawRegion, drawRegion.intersect(state.cropRegion), rotation, offset, scale, state.getAlpha());
}
Aggregations