package mods.eln.transparentnode.windturbine;
import mods.eln.cable.CableRenderType;
import mods.eln.misc.Direction;
import mods.eln.misc.LRDUMask;
import mods.eln.misc.RcInterpolator;
import mods.eln.node.transparent.TransparentNodeDescriptor;
import mods.eln.node.transparent.TransparentNodeElementInventory;
import mods.eln.node.transparent.TransparentNodeElementRender;
import mods.eln.node.transparent.TransparentNodeEntity;
import mods.eln.sound.SoundCommand;
import java.io.DataInputStream;
import java.io.IOException;
import java.util.Random;
public class WindTurbineRender extends TransparentNodeElementRender {
private float haloBlink_OnTime = 0.5f;
private float haloBlink_OffTime = 2.5f;
private boolean soundPlaying = false;
private float haloBlinkCounter = 0.f;
private boolean haloState = false;
private CableRenderType renderPreProcess;
private final LRDUMask eConn = new LRDUMask();
private final RcInterpolator powerFactorFilter = new RcInterpolator(2);
private final WindTurbineDescriptor descriptor;
private float alpha = (float) (Math.random() * 360);
private final TransparentNodeElementInventory inventory = new TransparentNodeElementInventory(0, 64, this);
private float wind;
private float powerFactor;
public WindTurbineRender(TransparentNodeEntity tileEntity, TransparentNodeDescriptor descriptor) {
super(tileEntity, descriptor);
this.descriptor = (WindTurbineDescriptor) descriptor;
Random rand = new Random();
this.haloBlinkCounter = rand.nextFloat() * this.haloBlink_OffTime;
this.haloBlink_OffTime += rand.nextFloat() * this.haloBlink_OffTime / 15.f;
this.haloBlink_OnTime += rand.nextFloat() * this.haloBlink_OnTime / 15.f;
}
@Override
public void draw() {
renderPreProcess = drawCable(Direction.YN, descriptor.cable.render, eConn, renderPreProcess);
front.glRotateXnRef();
descriptor.draw(alpha, haloState);
}
public void refresh(float deltaT) {
powerFactorFilter.setTarget(powerFactor);
powerFactorFilter.step(deltaT);
float alphaN_1 = alpha;
alpha += deltaT * descriptor.speed * Math.sqrt(powerFactorFilter.get());
if (alpha > 360) alpha -= 360;
if (alpha % 120 > 45 && alphaN_1 % 120 <= 45 && !soundPlaying) {
this.play(new SoundCommand(descriptor.soundName)
.mediumRange()
.mulBlockAttenuation(2)
.applyNominalVolume(descriptor.nominalVolume)
.mulVolume((0.007f + 1f * (float) Math.sqrt(powerFactorFilter.get())),
1f + (float) Math.sqrt(powerFactorFilter.get()) / 1.3f));
soundPlaying = true;
} else {
soundPlaying = false;
}
haloBlinkCounter += deltaT;
if (!haloState) {
if (haloBlinkCounter > haloBlink_OffTime) {
haloBlinkCounter -= haloBlink_OffTime;
haloState = true;
}
} else {
if (haloBlinkCounter > haloBlink_OnTime) {
haloBlinkCounter -= haloBlink_OnTime;
haloState = false;
}
}
}
@Override
public boolean cameraDrawOptimisation() {
return false;
}
@Override
public void networkUnserialize(DataInputStream stream) {
super.networkUnserialize(stream);
try {
wind = stream.readFloat();
powerFactor = stream.readFloat();
eConn.deserialize(stream);
} catch (IOException e) {
e.printStackTrace();
}
}
}