Search in sources :

Example 1 with FontMeshBuilder

use of org.terasology.rendering.assets.font.FontMeshBuilder in project Terasology by MovingBlocks.

the class FloatingTextRenderer method render.

private void render(Iterable<EntityRef> floatingTextEntities) {
    Vector3f cameraPosition = camera.getPosition();
    for (EntityRef entity : floatingTextEntities) {
        LocationComponent location = entity.getComponent(LocationComponent.class);
        if (location == null) {
            continue;
        }
        Vector3f worldPos = location.getWorldPosition();
        if (!worldProvider.isBlockRelevant(worldPos)) {
            continue;
        }
        FloatingTextComponent floatingText = entity.getComponent(FloatingTextComponent.class);
        String[] linesOfText = floatingText.text.split("\n");
        Color baseColor = floatingText.textColor;
        Color shadowColor = floatingText.textShadowColor;
        boolean underline = false;
        int textWidth = 0;
        for (String singleLine : linesOfText) {
            if (font.getWidth(singleLine) > textWidth) {
                textWidth = font.getWidth(singleLine);
            }
        }
        FontMeshBuilder meshBuilder = new FontMeshBuilder(underlineMaterial);
        Map<Material, Mesh> meshMap = entityMeshCache.get(entity);
        if (meshMap == null) {
            meshMap = meshBuilder.createTextMesh(font, Arrays.asList(linesOfText), textWidth, HorizontalAlign.CENTER, baseColor, shadowColor, underline);
            entityMeshCache.put(entity, meshMap);
        }
        if (floatingText.isOverlay) {
            glDisable(GL_DEPTH_TEST);
        }
        glPushMatrix();
        float scale = METER_PER_PIXEL * floatingText.scale;
        glTranslated(worldPos.x - cameraPosition.x, worldPos.y - cameraPosition.y, worldPos.z - cameraPosition.z);
        OpenGLUtils.applyBillboardOrientation();
        glScaled(scale, -scale, scale);
        glTranslated(-textWidth / 2.0, 0.0, 0.0);
        for (Map.Entry<Material, Mesh> meshMapEntry : meshMap.entrySet()) {
            Mesh mesh = meshMapEntry.getValue();
            Material material = meshMapEntry.getKey();
            material.enable();
            material.bindTextures();
            material.setFloat4("croppingBoundaries", Float.MIN_VALUE, Float.MAX_VALUE, Float.MIN_VALUE, Float.MAX_VALUE);
            material.setFloat2("offset", 0.0f, 0.0f);
            material.setFloat("alpha", 1.0f);
            mesh.render();
        }
        glPopMatrix();
        // Revert to default state
        if (floatingText.isOverlay) {
            glEnable(GL_DEPTH_TEST);
        }
    }
}
Also used : Color(org.terasology.rendering.nui.Color) Mesh(org.terasology.rendering.assets.mesh.Mesh) Material(org.terasology.rendering.assets.material.Material) LocationComponent(org.terasology.logic.location.LocationComponent) FontMeshBuilder(org.terasology.rendering.assets.font.FontMeshBuilder) Vector3f(org.terasology.math.geom.Vector3f) EntityRef(org.terasology.entitySystem.entity.EntityRef) Map(java.util.Map)

Aggregations

Map (java.util.Map)1 EntityRef (org.terasology.entitySystem.entity.EntityRef)1 LocationComponent (org.terasology.logic.location.LocationComponent)1 Vector3f (org.terasology.math.geom.Vector3f)1 FontMeshBuilder (org.terasology.rendering.assets.font.FontMeshBuilder)1 Material (org.terasology.rendering.assets.material.Material)1 Mesh (org.terasology.rendering.assets.mesh.Mesh)1 Color (org.terasology.rendering.nui.Color)1