Package mods.railcraft.client.render

Source Code of mods.railcraft.client.render.RenderTurbineGauge

/*
* Copyright (c) CovertJaguar, 2014 http://railcraft.info
*
* This code is the property of CovertJaguar
* and may only be used with explicit written
* permission unless otherwise specified on the
* license page at http://railcraft.info/wiki/info:license.
*/
package mods.railcraft.client.render;

import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.tileentity.TileEntity;

import mods.railcraft.common.blocks.machine.alpha.TileSteamTurbine;
import org.lwjgl.opengl.GL11;

public class RenderTurbineGauge extends TileEntitySpecialRenderer {

    @Override
    public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) {
        TileSteamTurbine turbine = (TileSteamTurbine) tile;

        if (!turbine.isStructureValid()
                || turbine.getPatternMarker() != 'W')
            // not a gauge block
            return;

        double halfWidth = 0.5 / 16; // half width of the needle
        double len = 0.26; // length of the needle (along the center)
        double zOffset = 0.001; // offset to prevent z-fighting

        // average the value over time to smooth the needle
        double value = turbine.mainGauge = (turbine.mainGauge * 14.0 + turbine.getMainGauge()) / 15.0;

        // set the needle angle between 45° (= 0%) and 135° (= 100%)
        double angle = Math.toRadians(90 * value + 45);

        int fx = 0, fz = 0; // vector towards the front of the gauge
        int rx = 0, rz = 0; // vector to the right when looking at the gauge

        if (turbine.getPatternIndex() == 0) {
            if (turbine.getPatternPositionX() == 1) {
                fx = -1;
                rz = 1;
            } else if (turbine.getPatternPositionX() == 2) {
                x++;
                z++;
                fx = 1;
                rz = -1;
            }
        } else if (turbine.getPatternIndex() == 1)
            if (turbine.getPatternPositionZ() == 1) {
                x++;
                fz = -1;
                rx = -1;
            } else if (turbine.getPatternPositionZ() == 2) {
                z++;
                fz = 1;
                rx = 1;
            }

        if (fx == 0 && fz == 0 || rx == 0 && rz == 0)
            throw new IllegalStateException("can't detect gauge orientation");

        // fix lightmap coords to use the brightness value in front of the block, not inside it (which would be just 0)
        int lmCoords = tile.getWorldObj().getLightBrightnessForSkyBlocks(tile.xCoord + fx, tile.yCoord, tile.zCoord + fz, 0);
        int lmX = lmCoords % 65536;
        int lmY = lmCoords / 65536;
        OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, lmX / 1.0F, lmY / 1.0F);

        GL11.glDisable(GL11.GL_TEXTURE_2D);
        GL11.glDisable(GL11.GL_LIGHTING);

        Tessellator tessellator = Tessellator.instance;

        tessellator.startDrawingQuads();
        // move the origin to the center of the gauge
        tessellator.setTranslation(x + rx * 0.5 + fx * zOffset, y + 0.5, z + rz * 0.5 + fz * zOffset);
        // set the needle color to dark-ish red
        tessellator.setColorRGBA(100, 0, 0, 255);

        double cosA = Math.cos(angle);
        double sinA = Math.sin(angle);

        // displacement along the length of the needle
        double glx = cosA * len;
        double gly = sinA * len;

        // displacement along the width of the needle
        double gwx = sinA * halfWidth;
        double gwy = cosA * halfWidth;

        // half width of the horizontal needle part where it connects to the "case"
        double baseOffset = 1. / Math.sin(angle) * halfWidth;

        tessellator.addVertex(-rx * baseOffset, 0, -rz * baseOffset);
        tessellator.addVertex(rx * baseOffset, 0, rz * baseOffset);
        tessellator.addVertex(-rx * glx + rx * gwx, gly + gwy, -rz * glx + rz * gwx);
        tessellator.addVertex(-rx * glx - rx * gwx, gly - gwy, -rz * glx - rz * gwx);

        tessellator.draw();

        // resetting
        tessellator.setTranslation(0, 0, 0);
        GL11.glEnable(GL11.GL_LIGHTING);
        GL11.glEnable(GL11.GL_TEXTURE_2D);
    }

}
TOP

Related Classes of mods.railcraft.client.render.RenderTurbineGauge

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.