Search in sources :

Example 1 with MeshBuilder

use of org.terasology.engine.rendering.assets.mesh.MeshBuilder in project Terasology by MovingBlocks.

the class AABBRenderer method generateDisplayListSolid.

private void generateDisplayListSolid() {
    MeshBuilder builder = new MeshBuilder();
    builder.addBox(aabb.extent(new Vector3f()).mul(-1.0f), aabb.extent(new Vector3f()).mul(2.0f), 0.0f, 0.0f).setTextureMapper(new MeshBuilder.TextureMapper() {

        @Override
        public void initialize(Vector3fc offset, Vector3fc size) {
        }

        @Override
        public Vector2fc map(int vertexIndex, float u, float v) {
            switch(vertexIndex) {
                // Front face
                case 0:
                    return new Vector2f(0f, 1f);
                case 1:
                    return new Vector2f(1f, 1f);
                case 2:
                    return new Vector2f(1f, 1);
                case 3:
                    return new Vector2f(0f, 1);
                // Back face
                case 4:
                    return new Vector2f(1f, 1f);
                case 5:
                    return new Vector2f(1f, 1);
                case 6:
                    return new Vector2f(0f, 1);
                case 7:
                    return new Vector2f(0f, 1f);
                // Top face
                case 8:
                    return new Vector2f(1f, 0f);
                case 9:
                    return new Vector2f(1f, 1f);
                case 10:
                    return new Vector2f(0f, 1f);
                case 11:
                    return new Vector2f(0f, 0f);
                // Bottom face
                case 12:
                    return new Vector2f(1f, 0f);
                case 13:
                    return new Vector2f(0f, 0f);
                case 14:
                    return new Vector2f(0f, 1f);
                case 15:
                    return new Vector2f(1f, 1f);
                // Right face
                case 16:
                    return new Vector2f(1f, 1f);
                case 17:
                    return new Vector2f(1f, 1);
                case 18:
                    return new Vector2f(0f, 1);
                case 19:
                    return new Vector2f(0f, 1f);
                // Left face
                case 20:
                    return new Vector2f(0f, 0f);
                case 21:
                    return new Vector2f(1f, 0f);
                case 22:
                    return new Vector2f(1f, 1.0f);
                case 23:
                    return new Vector2f(0f, 1.0f);
                default:
                    throw new RuntimeException("Unreachable state.");
            }
        }
    });
    for (int x = 0; x < 24; x++) {
        builder.addColor(new Color(solidColor.x, solidColor.y, solidColor.z, solidColor.w));
    }
    solidMesh = builder.build();
}
Also used : Vector3fc(org.joml.Vector3fc) Vector2fc(org.joml.Vector2fc) MeshBuilder(org.terasology.engine.rendering.assets.mesh.MeshBuilder) Vector2f(org.joml.Vector2f) Vector3f(org.joml.Vector3f) Color(org.terasology.nui.Color)

Example 2 with MeshBuilder

use of org.terasology.engine.rendering.assets.mesh.MeshBuilder in project Terasology by MovingBlocks.

the class LwjglCanvasRenderer method drawTexture.

@Override
public void drawTexture(UITextureRegion texture, Colorc color, ScaleMode mode, Rectanglei absoluteRegionRectangle, float ux, float uy, float uw, float uh, float alpha) {
    if (!((TextureRegion) texture).getTexture().isLoaded()) {
        return;
    }
    Rectanglei absoluteRegion = new Rectanglei(absoluteRegionRectangle);
    if (!currentTextureCropRegion.equals(requestedCropRegion) && !(currentTextureCropRegion.containsRectangle(absoluteRegion) && requestedCropRegion.containsRectangle(absoluteRegion))) {
        textureMat.setFloat4(CROPPING_BOUNDARIES_PARAM, requestedCropRegion.minX, requestedCropRegion.maxX, requestedCropRegion.minY, requestedCropRegion.maxY);
        currentTextureCropRegion = requestedCropRegion;
    }
    Vector2f scale = mode.scaleForRegion(absoluteRegionRectangle, texture.getWidth(), texture.getHeight());
    Rectanglef textureArea = new Rectanglef(texture.getRegion());
    Mesh mesh = billboard;
    switch(mode) {
        case TILED:
            {
                Vector2i textureSize = texture.size();
                TextureCacheKey key = new TextureCacheKey(textureSize, new Vector2i(absoluteRegion.getSizeX(), absoluteRegion.getSizeY()));
                usedTextures.add(key);
                mesh = cachedTextures.get(key);
                if (mesh == null || mesh.isDisposed()) {
                    MeshBuilder builder = new MeshBuilder();
                    addTiles(builder, absoluteRegion, FULL_REGION, textureSize, FULL_REGION);
                    mesh = builder.build();
                    cachedTextures.put(key, mesh);
                }
                textureMat.setFloat2("scale", scale);
                textureMat.setFloat2("offset", absoluteRegion.minX, absoluteRegion.minY);
                textureMat.setFloat2("texOffset", textureArea.minX + ux * textureArea.getSizeX(), textureArea.minY + uy * textureArea.getSizeY());
                textureMat.setFloat2("texSize", uw * textureArea.getSizeX(), uh * textureArea.getSizeY());
                break;
            }
        case SCALE_FILL:
            {
                textureMat.setFloat2("offset", absoluteRegion.minX, absoluteRegion.minY);
                textureMat.setFloat2("scale", absoluteRegion.getSizeX(), absoluteRegion.getSizeY());
                float texBorderX = (scale.x - absoluteRegion.getSizeX()) / scale.x * uw;
                float texBorderY = (scale.y - absoluteRegion.getSizeY()) / scale.y * uh;
                textureMat.setFloat2("texOffset", textureArea.minX + (ux + 0.5f * texBorderX) * textureArea.getSizeX(), textureArea.minY + (uy + 0.5f * texBorderY) * textureArea.getSizeY());
                textureMat.setFloat2("texSize", (uw - texBorderX) * textureArea.getSizeX(), (uh - texBorderY) * textureArea.getSizeY());
                break;
            }
        default:
            {
                textureMat.setFloat2("scale", scale);
                textureMat.setFloat2("offset", absoluteRegion.minX + 0.5f * (absoluteRegion.getSizeX() - scale.x), absoluteRegion.minY + 0.5f * (absoluteRegion.getSizeY() - scale.y));
                textureMat.setFloat2("texOffset", textureArea.minX + ux * textureArea.getSizeX(), textureArea.minY + uy * textureArea.getSizeY());
                textureMat.setFloat2("texSize", uw * textureArea.getSizeX(), uh * textureArea.getSizeY());
                break;
            }
    }
    textureMat.setTexture("tex", ((TextureRegion) texture).getTexture());
    textureMat.setFloat4("color", color.rf(), color.gf(), color.bf(), color.af() * alpha);
    textureMat.setMatrix4("projectionMatrix", projMatrix);
    textureMat.setMatrix4("modelViewMatrix", modelMatrixStack);
    textureMat.bindTextures();
    mesh.render();
}
Also used : UITextureRegion(org.terasology.nui.UITextureRegion) TextureRegion(org.terasology.engine.rendering.assets.texture.TextureRegion) Vector2f(org.joml.Vector2f) Rectanglef(org.terasology.joml.geom.Rectanglef) MeshBuilder(org.terasology.engine.rendering.assets.mesh.MeshBuilder) FontMeshBuilder(org.terasology.engine.rendering.assets.font.FontMeshBuilder) Mesh(org.terasology.engine.rendering.assets.mesh.Mesh) Rectanglei(org.terasology.joml.geom.Rectanglei) Vector2i(org.joml.Vector2i)

Example 3 with MeshBuilder

use of org.terasology.engine.rendering.assets.mesh.MeshBuilder in project Terasology by MovingBlocks.

the class LwjglCanvasRenderer method drawTextureBordered.

@Override
public void drawTextureBordered(UITextureRegion texture, Rectanglei regionRectangle, Border border, boolean tile, float ux, float uy, float uw, float uh, float alpha) {
    if (!((TextureRegion) texture).getTexture().isLoaded()) {
        return;
    }
    Rectanglei region = new Rectanglei(regionRectangle);
    if (!currentTextureCropRegion.equals(requestedCropRegion) && !(currentTextureCropRegion.containsRectangle(region) && requestedCropRegion.containsRectangle(region))) {
        textureMat.setFloat4(CROPPING_BOUNDARIES_PARAM, requestedCropRegion.minX, requestedCropRegion.maxX, requestedCropRegion.minY, requestedCropRegion.maxY);
        currentTextureCropRegion = requestedCropRegion;
    }
    Vector2i textureSize = new Vector2i(TeraMath.ceilToInt(texture.getWidth() * uw), TeraMath.ceilToInt(texture.getHeight() * uh));
    TextureCacheKey key = new TextureCacheKey(textureSize, new Vector2i(region.getSizeX(), region.getSizeY()), border, tile);
    usedTextures.add(key);
    Mesh mesh = cachedTextures.get(key);
    if (mesh == null || mesh.isDisposed()) {
        MeshBuilder builder = new MeshBuilder();
        float topTex = (float) border.getTop() / textureSize.y;
        float leftTex = (float) border.getLeft() / textureSize.x;
        float bottomTex = 1f - (float) border.getBottom() / textureSize.y;
        float rightTex = 1f - (float) border.getRight() / textureSize.x;
        int centerHoriz = region.getSizeX() - border.getTotalWidth();
        int centerVert = region.getSizeY() - border.getTotalHeight();
        float top = (float) border.getTop() / region.getSizeY();
        float left = (float) border.getLeft() / region.getSizeX();
        float bottom = 1f - (float) border.getBottom() / region.getSizeY();
        float right = 1f - (float) border.getRight() / region.getSizeX();
        if (border.getTop() != 0) {
            if (border.getLeft() != 0) {
                addRectPoly(builder, 0, 0, left, top, 0, 0, leftTex, topTex);
            }
            if (tile) {
                addTiles(builder, new Rectanglei(border.getLeft(), 0).setSize(centerHoriz, border.getTop()), new Rectanglef(left, 0, right, top), new Vector2i(textureSize.x - border.getTotalWidth(), border.getTop()), new Rectanglef(leftTex, 0, rightTex, topTex));
            } else {
                addRectPoly(builder, left, 0, right, top, leftTex, 0, rightTex, topTex);
            }
            if (border.getRight() != 0) {
                addRectPoly(builder, right, 0, 1, top, rightTex, 0, 1, topTex);
            }
        }
        if (border.getLeft() != 0) {
            if (tile) {
                addTiles(builder, new Rectanglei(0, border.getTop()).setSize(border.getLeft(), centerVert), new Rectanglef(0, top, left, bottom), new Vector2i(border.getLeft(), textureSize.y - border.getTotalHeight()), new Rectanglef(0, topTex, leftTex, bottomTex));
            } else {
                addRectPoly(builder, 0, top, left, bottom, 0, topTex, leftTex, bottomTex);
            }
        }
        if (tile) {
            addTiles(builder, new Rectanglei(border.getLeft(), border.getTop()).setSize(centerHoriz, centerVert), new Rectanglef(left, top, right, bottom), new Vector2i(textureSize.x - border.getTotalWidth(), textureSize.y - border.getTotalHeight()), new Rectanglef(leftTex, topTex, rightTex, bottomTex));
        } else {
            addRectPoly(builder, left, top, right, bottom, leftTex, topTex, rightTex, bottomTex);
        }
        if (border.getRight() != 0) {
            if (tile) {
                addTiles(builder, new Rectanglei(region.getSizeX() - border.getRight(), border.getTop()).setSize(border.getRight(), centerVert), new Rectanglef(right, top, 1, bottom), new Vector2i(border.getRight(), textureSize.y - border.getTotalHeight()), new Rectanglef(rightTex, topTex, 1, bottomTex));
            } else {
                addRectPoly(builder, right, top, 1, bottom, rightTex, topTex, 1, bottomTex);
            }
        }
        if (border.getBottom() != 0) {
            if (border.getLeft() != 0) {
                addRectPoly(builder, 0, bottom, left, 1, 0, bottomTex, leftTex, 1);
            }
            if (tile) {
                addTiles(builder, new Rectanglei(border.getLeft(), region.getSizeY() - border.getBottom()).setSize(centerHoriz, border.getBottom()), new Rectanglef(left, bottom, right, 1), new Vector2i(textureSize.x - border.getTotalWidth(), border.getBottom()), new Rectanglef(leftTex, bottomTex, rightTex, 1));
            } else {
                addRectPoly(builder, left, bottom, right, 1, leftTex, bottomTex, rightTex, 1);
            }
            if (border.getRight() != 0) {
                addRectPoly(builder, right, bottom, 1, 1, rightTex, bottomTex, 1, 1);
            }
        }
        mesh = builder.build();
        cachedTextures.put(key, mesh);
    }
    textureMat.setFloat2("scale", region.getSizeX(), region.getSizeY());
    textureMat.setFloat2("offset", region.minX, region.minY);
    Rectanglef textureArea = texture.getRegion();
    textureMat.setFloat2("texOffset", textureArea.minX + ux * textureArea.lengthX(), textureArea.minY + uy * textureArea.lengthY());
    textureMat.setFloat2("texSize", uw * textureArea.lengthX(), uh * textureArea.lengthY());
    textureMat.setTexture("tex", ((TextureRegion) texture).getTexture());
    textureMat.setFloat4("color", 1, 1, 1, alpha);
    textureMat.bindTextures();
    mesh.render();
}
Also used : UITextureRegion(org.terasology.nui.UITextureRegion) TextureRegion(org.terasology.engine.rendering.assets.texture.TextureRegion) MeshBuilder(org.terasology.engine.rendering.assets.mesh.MeshBuilder) FontMeshBuilder(org.terasology.engine.rendering.assets.font.FontMeshBuilder) Rectanglef(org.terasology.joml.geom.Rectanglef) Mesh(org.terasology.engine.rendering.assets.mesh.Mesh) Rectanglei(org.terasology.joml.geom.Rectanglei) Vector2i(org.joml.Vector2i)

Aggregations

MeshBuilder (org.terasology.engine.rendering.assets.mesh.MeshBuilder)3 Vector2f (org.joml.Vector2f)2 Vector2i (org.joml.Vector2i)2 FontMeshBuilder (org.terasology.engine.rendering.assets.font.FontMeshBuilder)2 Mesh (org.terasology.engine.rendering.assets.mesh.Mesh)2 TextureRegion (org.terasology.engine.rendering.assets.texture.TextureRegion)2 Rectanglef (org.terasology.joml.geom.Rectanglef)2 Rectanglei (org.terasology.joml.geom.Rectanglei)2 UITextureRegion (org.terasology.nui.UITextureRegion)2 Vector2fc (org.joml.Vector2fc)1 Vector3f (org.joml.Vector3f)1 Vector3fc (org.joml.Vector3fc)1 Color (org.terasology.nui.Color)1