package mods.eln.sixnode.lampsocket;
import mods.eln.misc.LRDU;
import mods.eln.misc.Obj3D;
import mods.eln.misc.Obj3D.Obj3DPart;
import mods.eln.misc.Utils;
import mods.eln.misc.UtilsClient;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import org.lwjgl.opengl.GL11;
public class LampSocketStandardObjRender implements LampSocketObjRender {
private Obj3D obj;
private Obj3DPart socket, socket_unlightable, socket_lightable, lampOn, lampOff, lightAlphaPlane, lightAlphaPlaneNoDepth;
ResourceLocation tOn, tOff;
private boolean onOffModel;
public LampSocketStandardObjRender(Obj3D obj, boolean onOffModel) {
this.obj = obj;
this.onOffModel = onOffModel;
if (obj != null) {
socket = obj.getPart("socket");
lampOn = obj.getPart("lampOn");
lampOff = obj.getPart("lampOff");
socket_unlightable = obj.getPart("socket_unlightable");
socket_lightable = obj.getPart("socket_lightable");
lightAlphaPlane = obj.getPart("lightAlpha");
lightAlphaPlaneNoDepth = obj.getPart("lightAlphaNoDepth");
tOff = obj.getModelResourceLocation(obj.getString("tOff"));
tOn = obj.getModelResourceLocation(obj.getString("tOn"));
}
}
@Override
public void draw(LampSocketDescriptor descriptor, ItemRenderType type, double distanceToPlayer) {
if (type == ItemRenderType.INVENTORY) {
if (descriptor.hasGhostGroup()) {
GL11.glScalef(0.5f, 0.5f, 0.5f);
GL11.glRotatef(90, 0, -1, 0);
GL11.glTranslatef(-1.5f, 0f, 0f);
}
} else if (type == ItemRenderType.EQUIPPED_FIRST_PERSON) {
if (descriptor.hasGhostGroup()) {
GL11.glScalef(0.3f, 0.3f, 0.3f);
GL11.glRotatef(90, 0, -1, 0);
GL11.glTranslatef(-0.5f, 0f, -1f);
}
}
draw(LRDU.Up, 0, (byte) 0, true, 15, distanceToPlayer);
}
@Override
public void draw(LampSocketRender render, double distanceToPlayer) {
int color = 15;
if (render.descriptor.paintable)
color = render.paintColor;
draw(render.front, render.alphaZ, render.light, render.lampDescriptor != null, color, distanceToPlayer);
}
public void draw(LRDU front, float alphaZ, byte light, boolean hasBulb, int color, double distanceToPlayer) {
front.glRotateOnX();
UtilsClient.disableCulling();
Utils.setGlColorFromLamp(color);
if (!onOffModel) {
if (socket != null) socket.draw();
} else {
//
if (light > 8) {
UtilsClient.bindTexture(tOn);
} else {
UtilsClient.bindTexture(tOff);
}
if (socket_unlightable != null) socket_unlightable.drawNoBind();
if (light > 8) {
UtilsClient.disableLight();
float l = (light) / 14f;
//GL11.glColor3f(l, l, l);
if (socket_lightable != null) socket_lightable.drawNoBind();
//GL11.glColor3f(1f, 1f, 1f);
}
if (hasBulb) {
if (light > 8) {
if (lampOn != null) lampOn.draw();
} else {
if (lampOff != null) lampOff.draw();
}
}
if (socket != null) socket.drawNoBind();
if (light > 8)
UtilsClient.enableLight();
//
}
UtilsClient.enableBlend();
UtilsClient.disableLight();
if (lightAlphaPlaneNoDepth != null) {
float coeff = /*1.5f*/2.0f - (float) distanceToPlayer;
if (coeff > 0.0f) {
UtilsClient.enableCulling();
UtilsClient.disableDepthTest(); //Beautiful effect, but overlay the whole render (i.e. through wall) : so distance limited.
GL11.glColor4f(1.f, 1.f, 1.f, light * 0.06667f * coeff);
lightAlphaPlaneNoDepth.draw();
UtilsClient.enableDepthTest();
UtilsClient.disableCulling();
}
}
if (lightAlphaPlane != null) {
GL11.glColor4f(1.f, 0.98f, 0.92f, light * 0.06667f);
lightAlphaPlane.draw();
}
UtilsClient.enableLight();
UtilsClient.disableBlend();
UtilsClient.enableCulling();
/*
* GL11.glLineWidth(2f); GL11.glDisable(GL11.GL_TEXTURE_2D); GL11.glDisable(GL11.GL_LIGHTING); GL11.glColor3f(1f,1f,1f); GL11.glBegin(GL11.GL_LINES); GL11.glVertex3d(0f, 0f, 0f); GL11.glVertex3d(Math.cos(alphaZ*Math.PI/180.0), Math.sin(alphaZ*Math.PI/180.0),0.0); GL11.glEnd(); GL11.glEnable(GL11.GL_TEXTURE_2D); GL11.glEnable(GL11.GL_LIGHTING);
*/
}
}