Search in sources :

Example 6 with Rect2i

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));
    }
}
Also used : Rect2i(org.terasology.math.geom.Rect2i) SubRegion(org.terasology.rendering.nui.SubRegion) LayoutHint(org.terasology.rendering.nui.LayoutHint)

Example 7 with Rect2i

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();
}
Also used : Rect2i(org.terasology.math.geom.Rect2i) Tessellator(org.terasology.rendering.primitives.Tessellator) Vector4f(org.terasology.math.geom.Vector4f) ByteBuffer(java.nio.ByteBuffer)

Example 8 with Rect2i

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);
        }
    }
}
Also used : Rect2i(org.terasology.math.geom.Rect2i) Vector2i(org.terasology.math.geom.Vector2i)

Example 9 with Rect2i

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));
        }
    }
}
Also used : Rect2i(org.terasology.math.geom.Rect2i) Vector2i(org.terasology.math.geom.Vector2i) BaseVector2i(org.terasology.math.geom.BaseVector2i)

Example 10 with Rect2i

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());
}
Also used : Rect2i(org.terasology.math.geom.Rect2i)

Aggregations

Rect2i (org.terasology.math.geom.Rect2i)59 Vector2i (org.terasology.math.geom.Vector2i)13 SubRegion (org.terasology.rendering.nui.SubRegion)8 BaseVector2i (org.terasology.math.geom.BaseVector2i)7 Font (org.terasology.rendering.assets.font.Font)5 LayoutHint (org.terasology.rendering.nui.LayoutHint)5 SurfaceHeightFacet (org.terasology.world.generation.facets.SurfaceHeightFacet)4 ByteBuffer (java.nio.ByteBuffer)3 List (java.util.List)3 Color (org.terasology.rendering.nui.Color)3 BufferedImage (java.awt.image.BufferedImage)2 Test (org.junit.Test)2 UIWidget (org.terasology.rendering.nui.UIWidget)2 FallbackParagraphRenderStyle (org.terasology.rendering.nui.widgets.browser.ui.style.FallbackParagraphRenderStyle)2 ParagraphRenderStyle (org.terasology.rendering.nui.widgets.browser.ui.style.ParagraphRenderStyle)2 Maps (com.google.common.collect.Maps)1 Sets (com.google.common.collect.Sets)1 TIntList (gnu.trove.list.TIntList)1 Graphics2D (java.awt.Graphics2D)1 DataBufferInt (java.awt.image.DataBufferInt)1