178 lines
6.1 KiB
Java
178 lines
6.1 KiB
Java
/*
|
|
* Copyright (C) 2018 BARBOTIN Nicolas
|
|
*/
|
|
|
|
package net.montoyo.wd.client.renderers;
|
|
|
|
import net.minecraft.client.renderer.BufferBuilder;
|
|
import net.minecraft.client.renderer.GlStateManager;
|
|
import net.minecraft.client.renderer.RenderHelper;
|
|
import net.minecraft.client.renderer.Tessellator;
|
|
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
|
|
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
|
|
import net.minecraft.util.math.AxisAlignedBB;
|
|
import net.montoyo.wd.WebDisplays;
|
|
import net.montoyo.wd.client.ClientProxy;
|
|
import net.montoyo.wd.entity.TileEntityScreen;
|
|
import net.montoyo.wd.utilities.Vector3f;
|
|
import net.montoyo.wd.utilities.Vector3i;
|
|
|
|
import static org.lwjgl.opengl.GL11.*;
|
|
|
|
public class ScreenRenderer extends TileEntitySpecialRenderer<TileEntityScreen> {
|
|
|
|
private final Vector3f mid = new Vector3f();
|
|
private final Vector3i tmpi = new Vector3i();
|
|
private final Vector3f tmpf = new Vector3f();
|
|
|
|
@Override
|
|
public void render(TileEntityScreen te, double x, double y, double z, float partialTicks, int destroyStage, float alpha) {
|
|
if(!te.isLoaded())
|
|
return;
|
|
|
|
//Disable lighting
|
|
RenderHelper.disableStandardItemLighting();
|
|
setLightmapDisabled(true);
|
|
glEnable(GL_TEXTURE_2D);
|
|
glDisable(GL_CULL_FACE);
|
|
glDisable(GL_BLEND);
|
|
|
|
for(int i = 0; i < te.screenCount(); i++) {
|
|
TileEntityScreen.Screen scr = te.getScreen(i);
|
|
if(scr.browser == null) {
|
|
scr.browser = ((ClientProxy) WebDisplays.PROXY).getMCEF().createBrowser(scr.url);
|
|
scr.browser.resize(scr.resolution.x, scr.resolution.y);
|
|
}
|
|
|
|
tmpi.set(scr.side.right);
|
|
tmpi.mul(scr.size.x);
|
|
tmpi.addMul(scr.side.up, scr.size.y);
|
|
tmpf.set(tmpi);
|
|
|
|
mid.set(x + 0.5, y + 0.5, z + 0.5);
|
|
mid.addMul(tmpf, 0.5f);
|
|
tmpf.set(scr.side.left);
|
|
mid.addMul(tmpf, 0.5f);
|
|
tmpf.set(scr.side.down);
|
|
mid.addMul(tmpf, 0.5f);
|
|
|
|
glPushMatrix();
|
|
glTranslatef(mid.x, mid.y, mid.z);
|
|
|
|
switch(scr.side) {
|
|
case BOTTOM:
|
|
glRotatef(90.f, 1.f, 0.f, 0.f);
|
|
break;
|
|
|
|
case TOP:
|
|
glRotatef(-90.f, 1.f, 0.f, 0.f);
|
|
break;
|
|
|
|
case NORTH:
|
|
glRotatef(180.f, 0.f, 1.f, 0.f);
|
|
break;
|
|
|
|
case SOUTH:
|
|
break;
|
|
|
|
case WEST:
|
|
glRotatef(-90.f, 0.f, 1.f, 0.f);
|
|
break;
|
|
|
|
case EAST:
|
|
glRotatef(90.f, 0.f, 1.f, 0.f);
|
|
break;
|
|
}
|
|
|
|
float sw = ((float) scr.size.x) * 0.5f - 2.f / 16.f;
|
|
float sh = ((float) scr.size.y) * 0.5f - 2.f / 16.f;
|
|
|
|
glBindTexture(GL_TEXTURE_2D, scr.browser.getTextureID());
|
|
glBegin(GL_QUADS);
|
|
glColor4f(1.f, 1.f, 1.f, 1.f); glTexCoord2f(0.f, 1.f); glVertex3f(-sw, -sh, 0.505f);
|
|
glColor4f(1.f, 1.f, 1.f, 1.f); glTexCoord2f(1.f, 1.f); glVertex3f( sw, -sh, 0.505f);
|
|
glColor4f(1.f, 1.f, 1.f, 1.f); glTexCoord2f(1.f, 0.f); glVertex3f( sw, sh, 0.505f);
|
|
glColor4f(1.f, 1.f, 1.f, 1.f); glTexCoord2f(0.f, 0.f); glVertex3f(-sw, sh, 0.505f);
|
|
glEnd();
|
|
GlStateManager.bindTexture(0); //Minecraft does shit with mah texture otherwise...
|
|
glPopMatrix();
|
|
}
|
|
|
|
/*
|
|
//Bounding box debugging
|
|
glPushMatrix();
|
|
glTranslated(-rendererDispatcher.entityX, -rendererDispatcher.entityY, -rendererDispatcher.entityZ);
|
|
renderAABB(te.getRenderBoundingBox());
|
|
glPopMatrix();
|
|
*/
|
|
|
|
//Re-enable lighting
|
|
RenderHelper.enableStandardItemLighting();
|
|
setLightmapDisabled(false);
|
|
glEnable(GL_CULL_FACE);
|
|
}
|
|
|
|
public void renderAABB(AxisAlignedBB bb) {
|
|
glDisable(GL_TEXTURE_2D);
|
|
glEnable(GL_BLEND);
|
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
glDisable(GL_CULL_FACE);
|
|
glColor4f(0.f, 0.5f, 1.f, 0.75f);
|
|
glDepthMask(false);
|
|
|
|
Tessellator t = Tessellator.getInstance();
|
|
BufferBuilder vb = t.getBuffer();
|
|
vb.begin(GL_QUADS, DefaultVertexFormats.POSITION);
|
|
|
|
//Bottom
|
|
vb.pos(bb.minX, bb.minY, bb.minZ).endVertex();
|
|
vb.pos(bb.maxX, bb.minY, bb.minZ).endVertex();
|
|
vb.pos(bb.maxX, bb.minY, bb.maxZ).endVertex();
|
|
vb.pos(bb.minX, bb.minY, bb.maxZ).endVertex();
|
|
|
|
//Top
|
|
vb.pos(bb.minX, bb.maxY, bb.minZ).endVertex();
|
|
vb.pos(bb.maxX, bb.maxY, bb.minZ).endVertex();
|
|
vb.pos(bb.maxX, bb.maxY, bb.maxZ).endVertex();
|
|
vb.pos(bb.minX, bb.maxY, bb.maxZ).endVertex();
|
|
|
|
//Left
|
|
vb.pos(bb.minX, bb.minY, bb.minZ).endVertex();
|
|
vb.pos(bb.minX, bb.minY, bb.maxZ).endVertex();
|
|
vb.pos(bb.minX, bb.maxY, bb.maxZ).endVertex();
|
|
vb.pos(bb.minX, bb.maxY, bb.minZ).endVertex();
|
|
|
|
//Right
|
|
vb.pos(bb.maxX, bb.minY, bb.minZ).endVertex();
|
|
vb.pos(bb.maxX, bb.minY, bb.maxZ).endVertex();
|
|
vb.pos(bb.maxX, bb.maxY, bb.maxZ).endVertex();
|
|
vb.pos(bb.maxX, bb.maxY, bb.minZ).endVertex();
|
|
|
|
//Front
|
|
vb.pos(bb.minX, bb.minY, bb.minZ).endVertex();
|
|
vb.pos(bb.maxX, bb.minY, bb.minZ).endVertex();
|
|
vb.pos(bb.maxX, bb.maxY, bb.minZ).endVertex();
|
|
vb.pos(bb.minX, bb.maxY, bb.minZ).endVertex();
|
|
|
|
//Back
|
|
vb.pos(bb.minX, bb.minY, bb.maxZ).endVertex();
|
|
vb.pos(bb.maxX, bb.minY, bb.maxZ).endVertex();
|
|
vb.pos(bb.maxX, bb.maxY, bb.maxZ).endVertex();
|
|
vb.pos(bb.minX, bb.maxY, bb.maxZ).endVertex();
|
|
t.draw();
|
|
|
|
glDepthMask(true);
|
|
glEnable(GL_CULL_FACE);
|
|
glEnable(GL_TEXTURE_2D);
|
|
glDisable(GL_BLEND);
|
|
}
|
|
|
|
@Override
|
|
public boolean isGlobalRenderer(TileEntityScreen te) {
|
|
//I don't like making it a global renderer for performance reasons,
|
|
//but Minecraft's AABB-in-view-frustum checking is crappy as hell.
|
|
return te.isLoaded();
|
|
}
|
|
|
|
}
|