114 lines
3.9 KiB
Java
114 lines
3.9 KiB
Java
package eu.crushedpixel.replaymod.renderer;
|
|
|
|
import eu.crushedpixel.replaymod.holders.CustomImageObject;
|
|
import eu.crushedpixel.replaymod.holders.ExtendedPosition;
|
|
import eu.crushedpixel.replaymod.replay.ReplayHandler;
|
|
import net.minecraft.client.Minecraft;
|
|
import net.minecraft.client.renderer.GlStateManager;
|
|
import net.minecraft.client.renderer.Tessellator;
|
|
import net.minecraft.client.renderer.WorldRenderer;
|
|
import net.minecraft.entity.Entity;
|
|
import net.minecraftforge.client.event.RenderWorldLastEvent;
|
|
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
|
import org.lwjgl.opengl.GL11;
|
|
|
|
/**
|
|
* Allows users to render custom images in the World.
|
|
*/
|
|
public class CustomObjectRenderer {
|
|
|
|
private static final Minecraft mc = Minecraft.getMinecraft();
|
|
|
|
@SubscribeEvent
|
|
public void renderCustomObjects(RenderWorldLastEvent event) {
|
|
if(!ReplayHandler.isInReplay()) return;
|
|
|
|
Entity entity = ReplayHandler.getCameraEntity();
|
|
if(entity == null) return;
|
|
|
|
double doubleX = entity.posX;
|
|
double doubleY = entity.posY;
|
|
double doubleZ = entity.posZ;
|
|
|
|
GlStateManager.pushAttrib();
|
|
GlStateManager.pushMatrix();
|
|
|
|
GlStateManager.disableLighting();
|
|
GlStateManager.enableBlend();
|
|
|
|
GlStateManager.disableTexture2D();
|
|
|
|
for(CustomImageObject object : ReplayHandler.getCustomImageObjects()) {
|
|
drawCustomImageObject(doubleX, doubleY, doubleZ, object);
|
|
}
|
|
|
|
GlStateManager.enableTexture2D();
|
|
GlStateManager.enableLighting();
|
|
|
|
GlStateManager.disableBlend();
|
|
GlStateManager.popAttrib();
|
|
GlStateManager.popMatrix();
|
|
}
|
|
|
|
private void drawCustomImageObject(double playerX, double playerY, double playerZ, CustomImageObject customImageObject) {
|
|
GlStateManager.pushMatrix();
|
|
GlStateManager.enableTexture2D();
|
|
GlStateManager.enableLighting();
|
|
GlStateManager.disableLighting();
|
|
GlStateManager.enableAlpha();
|
|
|
|
GlStateManager.disableBlend();
|
|
|
|
Tessellator tessellator = Tessellator.getInstance();
|
|
WorldRenderer renderer = tessellator.getWorldRenderer();
|
|
|
|
mc.renderEngine.bindTexture(customImageObject.getResourceLocation());
|
|
|
|
ExtendedPosition objectPosition = customImageObject.getPosition();
|
|
|
|
double x = objectPosition.getX() - playerX;
|
|
double y = objectPosition.getY() - playerY;
|
|
double z = objectPosition.getZ() - playerZ;
|
|
|
|
GL11.glNormal3f(0, 1, 0);
|
|
|
|
GlStateManager.translate(x, y + 1.4, z);
|
|
|
|
GlStateManager.rotate(-objectPosition.getYaw(), 0, 1, 0);
|
|
GlStateManager.rotate(objectPosition.getRoll(), 0, 0, 1);
|
|
GlStateManager.rotate(objectPosition.getPitch(), 1, 0, 0);
|
|
|
|
renderer.setColorRGBA_F(1, 1, 1, 0.5f);
|
|
|
|
float width = objectPosition.getWidth() * objectPosition.getScale();
|
|
float height = objectPosition.getHeight() * objectPosition.getScale();
|
|
|
|
float minX = -width/2 + objectPosition.getAnchorX();
|
|
float maxX = width/2 + objectPosition.getAnchorX();
|
|
float minY = -height/2 + objectPosition.getAnchorY();
|
|
float maxY = height/2 + objectPosition.getAnchorY();
|
|
|
|
renderer.startDrawingQuads();
|
|
|
|
renderer.addVertexWithUV(minX, minY, 0, 1, 1);
|
|
renderer.addVertexWithUV(minX, maxY, 0, 1, 0);
|
|
renderer.addVertexWithUV(maxX, maxY, 0, 0, 0);
|
|
renderer.addVertexWithUV(maxX, minY, 0, 0, 1);
|
|
|
|
if(customImageObject.isBackVisible()) {
|
|
renderer.addVertexWithUV(maxX, maxY, 0, 0, 0);
|
|
renderer.addVertexWithUV(minX, maxY, 0, 1, 0);
|
|
renderer.addVertexWithUV(minX, minY, 0, 1, 1);
|
|
renderer.addVertexWithUV(maxX, minY, 0, 0, 1);
|
|
}
|
|
|
|
tessellator.draw();
|
|
renderer.setTranslation(0, 0, 0);
|
|
|
|
GlStateManager.disableAlpha();
|
|
GlStateManager.disableTexture2D();
|
|
GlStateManager.enableLighting();
|
|
GlStateManager.popMatrix();
|
|
}
|
|
}
|