webdisplays/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java
Nicolas BARBOTIN eca8c60319 * Java fixes
+ Added README with TODO list
2018-01-26 19:59:41 +01:00

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();
}
}