package mods.eln.transparentnode.turbine;
import mods.eln.cable.CableRender;
import mods.eln.cable.CableRenderDescriptor;
import mods.eln.cable.CableRenderType;
import mods.eln.misc.*;
import mods.eln.node.transparent.TransparentNodeDescriptor;
import mods.eln.node.transparent.TransparentNodeElementRender;
import mods.eln.node.transparent.TransparentNodeEntity;
import mods.eln.sound.LoopedSound;
import net.minecraft.client.audio.ISound;
import org.lwjgl.opengl.GL11;
import java.io.DataInputStream;
import java.io.IOException;
public class TurbineRender extends TransparentNodeElementRender {
private final TurbineDescriptor descriptor;
private CableRenderType connectionType;
private final SlewLimiter factorLimiter = new SlewLimiter(0.2f);
private boolean cableRefresh;
private final LRDUMask eConn = new LRDUMask();
private final LRDUMask maskTemp = new LRDUMask();
public TurbineRender(TransparentNodeEntity tileEntity, TransparentNodeDescriptor descriptor) {
super(tileEntity, descriptor);
this.descriptor = (TurbineDescriptor) descriptor;
addLoopedSound(new LoopedSound(this.descriptor.soundFile, coordonate(), ISound.AttenuationType.LINEAR) {
@Override
public float getVolume() {
return 0.1f * factorLimiter.getPosition();
}
@Override
public float getPitch() {
return 0.9f + 0.2f * factorLimiter.getPosition();
}
});
}
@Override
public void draw() {
GL11.glPushMatrix();
front.glRotateXnRef();
GL11.glScalef(1.0f, 1.0f, 1.0f);
descriptor.draw();
GL11.glPopMatrix();
if (cableRefresh) {
cableRefresh = false;
connectionType = CableRender.connectionType(tileEntity, eConn, front.down());
}
glCableTransforme(front.down());
descriptor.eRender.bindCableTexture();
for (LRDU lrdu : LRDU.values()) {
Utils.setGlColorFromDye(connectionType.otherdry[lrdu.toInt()]);
if (!eConn.get(lrdu)) continue;
if (lrdu != front.down().getLRDUGoingTo(front) && lrdu.inverse() != front.down().getLRDUGoingTo(front))
continue;
maskTemp.set(1 << lrdu.toInt());
CableRender.drawCable(descriptor.eRender, maskTemp, connectionType);
}
}
@Override
public CableRenderDescriptor getCableRender(Direction side, LRDU lrdu) {
if (lrdu == LRDU.Down) {
if (side == front) return descriptor.eRender;
if (side == front.back()) return descriptor.eRender;
}
return null;
}
@Override
public void networkUnserialize(DataInputStream stream) {
super.networkUnserialize(stream);
eConn.deserialize(stream);
cableRefresh = true;
try {
float deltaT = stream.readFloat();
if (deltaT >= 40) {
factorLimiter.setTarget((float) (deltaT / TurbineRender.this.descriptor.nominalDeltaT));
} else {
factorLimiter.setTarget(0);
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void refresh(float deltaT) {
factorLimiter.step(deltaT);
super.refresh(deltaT);
}
}