Move everything to com.replaymod package Add KeyBindingRegistry and SettingsRegistry Recreate settings GUI with new GUI API and dynamically from SettingsRegistry Use ReplayFile from ReplayStudio ReplayHandler is now object oriented Add GuiOverlay, GuiSlider and GuiTexturedButton to GUI API Rewrite both overlays to use new GUI API Fix size capping in vertical and horizontal layout Allow CustomLayouts to have parents Fix tooltip rendering when close to screen border Allow changing of columns in GridLayout
310 lines
11 KiB
Java
310 lines
11 KiB
Java
package eu.crushedpixel.replaymod.renderer;
|
|
|
|
import eu.crushedpixel.replaymod.events.KeyframesModifyEvent;
|
|
import eu.crushedpixel.replaymod.holders.AdvancedPosition;
|
|
import eu.crushedpixel.replaymod.holders.Keyframe;
|
|
import eu.crushedpixel.replaymod.holders.SpectatorData;
|
|
import eu.crushedpixel.replaymod.interpolation.AdvancedPositionKeyframeList;
|
|
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.util.ResourceLocation;
|
|
import net.minecraftforge.client.event.RenderWorldLastEvent;
|
|
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
|
import org.lwjgl.opengl.GL11;
|
|
|
|
import java.awt.*;
|
|
import java.util.Comparator;
|
|
|
|
import static com.replaymod.core.ReplayMod.TEXTURE;
|
|
|
|
public class PathPreviewRenderer {
|
|
|
|
private static final Minecraft mc = Minecraft.getMinecraft();
|
|
private static final int DEFAULT_PATH_COLOR = Color.RED.getRGB();
|
|
private static final int SPECTATOR_PATH_COLOR = Color.BLUE.getRGB();
|
|
|
|
private DistanceComparator distanceComparator = new DistanceComparator();
|
|
|
|
private AdvancedPositionKeyframeList keyframes;
|
|
|
|
private final ResourceLocation cameraHeadResource = new ResourceLocation("replaymod", "camera_head.png");
|
|
|
|
@SubscribeEvent
|
|
public void renderCameraPath(RenderWorldLastEvent event) {
|
|
// TODO
|
|
// if(!ReplayHandler.isInReplay() || ReplayHandler.isInPath() || !ReplayMod.replaySettings.showPathPreview() || mc.gameSettings.hideGUI) return;
|
|
//
|
|
// GlStateManager.pushAttrib();
|
|
//
|
|
// int renderDistanceSquared = mc.gameSettings.renderDistanceChunks*16 * mc.gameSettings.renderDistanceChunks*16;
|
|
//
|
|
// Entity entity = ReplayHandler.getCameraEntity();
|
|
// if(entity == null) return;
|
|
//
|
|
// double doubleX = entity.posX;
|
|
// double doubleY = entity.posY;
|
|
// double doubleZ = entity.posZ;
|
|
//
|
|
// GlStateManager.disableLighting();
|
|
// GlStateManager.disableTexture2D();
|
|
// GlStateManager.enableBlend();
|
|
//
|
|
// if(keyframes.size() > 1) {
|
|
// AdvancedPosition previousPosition = null;
|
|
//
|
|
// int i = 0;
|
|
// for(Keyframe<AdvancedPosition> keyframe : keyframes) {
|
|
// int timestamp = keyframe.getRealTimestamp();
|
|
// int nextTimestamp = timestamp;
|
|
//
|
|
// if(i+1 < keyframes.size()) {
|
|
// nextTimestamp = keyframes.get(i+1).getRealTimestamp();
|
|
// }
|
|
//
|
|
// int diff = nextTimestamp-timestamp;
|
|
// int step = diff/100;
|
|
//
|
|
// for(int currentTimestamp = timestamp; currentTimestamp < nextTimestamp; currentTimestamp += step) {
|
|
// AdvancedPosition position = keyframes.getInterpolatedValueForTimestamp(currentTimestamp, ReplayMod.replaySettings.isLinearMovement());
|
|
// if(previousPosition != null) {
|
|
// drawConnection(doubleX, doubleY, doubleZ, previousPosition, position, DEFAULT_PATH_COLOR, renderDistanceSquared);
|
|
// }
|
|
// previousPosition = position;
|
|
// }
|
|
//
|
|
// i++;
|
|
// }
|
|
// }
|
|
//
|
|
// distanceComparator.setPlayerPos(doubleX, doubleY + 1.4, doubleZ);
|
|
//
|
|
// List<Keyframe<AdvancedPosition>> distanceSorted = new ArrayList<Keyframe<AdvancedPosition>>(keyframes);
|
|
// Collections.sort(distanceSorted, distanceComparator);
|
|
//
|
|
// GlStateManager.enableTexture2D();
|
|
// GlStateManager.blendFunc(GL11.GL_DST_COLOR, GL11.GL_SRC_COLOR);
|
|
//
|
|
// GlStateManager.disableDepth();
|
|
//
|
|
// for(Keyframe<AdvancedPosition> kf : distanceSorted) {
|
|
// if(kf.getValue().distanceSquared(entity.posX, entity.posY, entity.posZ) < renderDistanceSquared) {
|
|
// drawPoint(doubleX, doubleY, doubleZ, kf);
|
|
// }
|
|
// }
|
|
//
|
|
// if(ReplayHandler.getPositionKeyframes().size() > 1) {
|
|
// AdvancedPosition cameraPosition = ReplayHandler.getPositionKeyframes().getInterpolatedValueForTimestamp(ReplayHandler.getRealTimelineCursor(),
|
|
// ReplayMod.replaySettings.isLinearMovement());
|
|
// if(cameraPosition != null) {
|
|
// GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
|
|
// drawCamera(doubleX, doubleY, doubleZ, cameraPosition);
|
|
// }
|
|
// }
|
|
//
|
|
// GlStateManager.disableBlend();
|
|
//
|
|
// GlStateManager.popAttrib();
|
|
}
|
|
|
|
@SubscribeEvent
|
|
public void recalcSpline(KeyframesModifyEvent event) {
|
|
// TODO
|
|
// keyframes = ReplayHandler.getPositionKeyframes();
|
|
}
|
|
|
|
private class DistanceComparator implements Comparator<Keyframe<AdvancedPosition>> {
|
|
|
|
private double playerX, playerY, playerZ;
|
|
|
|
public void setPlayerPos(double playerX, double playerY, double playerZ) {
|
|
this.playerX = playerX;
|
|
this.playerY = playerY;
|
|
this.playerZ = playerZ;
|
|
}
|
|
|
|
@Override
|
|
public int compare(Keyframe<AdvancedPosition> o1, Keyframe<AdvancedPosition> o2) {
|
|
return -(new Double(o1.getValue().distanceSquared(playerX, playerY, playerZ)).compareTo(o2.getValue().distanceSquared(playerX, playerY, playerZ)));
|
|
}
|
|
|
|
@Override
|
|
public boolean equals(Object obj) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
private void drawConnection(double playerX, double playerY, double playerZ, AdvancedPosition pos1, AdvancedPosition pos2, int color, int renderDistanceSquared) {
|
|
if(pos2.distanceSquared(playerX, playerY, playerZ) > renderDistanceSquared) return;
|
|
GlStateManager.pushMatrix();
|
|
|
|
Tessellator tessellator = Tessellator.getInstance();
|
|
WorldRenderer renderer = tessellator.getWorldRenderer();
|
|
|
|
GL11.glLineWidth(3.0F);
|
|
|
|
double x = pos1.getX() - playerX;
|
|
double y = pos1.getY() - playerY;
|
|
double z = pos1.getZ() - playerZ;
|
|
|
|
renderer.setTranslation(x, y+1.4, z);
|
|
|
|
renderer.startDrawing(1);
|
|
|
|
renderer.setColorRGBA_I(color, 255);
|
|
|
|
renderer.addVertex(pos2.getX() - pos1.getX(), pos2.getY() - pos1.getY(), pos2.getZ() - pos1.getZ());
|
|
renderer.addVertex(0, 0, 0);
|
|
|
|
tessellator.draw();
|
|
renderer.setTranslation(0, 0, 0);
|
|
|
|
GlStateManager.popMatrix();
|
|
}
|
|
|
|
private void drawPoint(double playerX, double playerY, double playerZ, Keyframe<AdvancedPosition> kf) {
|
|
GlStateManager.pushMatrix();
|
|
|
|
Tessellator tessellator = Tessellator.getInstance();
|
|
WorldRenderer renderer = tessellator.getWorldRenderer();
|
|
|
|
mc.renderEngine.bindTexture(TEXTURE);
|
|
|
|
AdvancedPosition pos1 = kf.getValue();
|
|
|
|
double x = pos1.getX() - playerX;
|
|
double y = pos1.getY() - playerY;
|
|
double z = pos1.getZ() - playerZ;
|
|
|
|
GlStateManager.translate(x, y+1.4, z);
|
|
|
|
float pitch = mc.getRenderManager().playerViewX;
|
|
float yaw = mc.getRenderManager().playerViewY;
|
|
|
|
GL11.glNormal3f(0, 1, 0);
|
|
|
|
GlStateManager.rotate(-yaw, 0, 1, 0);
|
|
GlStateManager.rotate(pitch, 1, 0, 0);
|
|
|
|
renderer.startDrawingQuads();
|
|
|
|
float posX = 80/128f;
|
|
float posY = 0;
|
|
float size = 10/128f;
|
|
|
|
|
|
// TODO
|
|
// if(kf.equals(ReplayHandler.getSelectedKeyframe())) {
|
|
// posY += size;
|
|
// }
|
|
|
|
if(pos1 instanceof SpectatorData) {
|
|
posX += size;
|
|
}
|
|
|
|
float minX = -0.5f;
|
|
float minY = -0.5f;
|
|
float maxX = 0.5f;
|
|
float maxY = 0.5f;
|
|
|
|
renderer.addVertexWithUV(minX, minY, 0, posX + size, posY + size);
|
|
renderer.addVertexWithUV(minX, maxY, 0, posX + size, posY);
|
|
renderer.addVertexWithUV(maxX, maxY, 0, posX, posY);
|
|
renderer.addVertexWithUV(maxX, minY, 0, posX, posY + size);
|
|
|
|
tessellator.draw();
|
|
renderer.setTranslation(0, 0, 0);
|
|
|
|
GlStateManager.popMatrix();
|
|
}
|
|
|
|
private void drawCamera(double playerX, double playerY, double playerZ, AdvancedPosition pos) {
|
|
GlStateManager.pushMatrix();
|
|
|
|
Tessellator tessellator = Tessellator.getInstance();
|
|
WorldRenderer renderer = tessellator.getWorldRenderer();
|
|
|
|
mc.renderEngine.bindTexture(cameraHeadResource);
|
|
|
|
double x = pos.getX() - playerX;
|
|
double y = pos.getY() - playerY;
|
|
double z = pos.getZ() - playerZ;
|
|
|
|
GlStateManager.translate(x, y + 1.4, z);
|
|
|
|
GL11.glNormal3f(0, 1, 0);
|
|
|
|
//draw the position line
|
|
AdvancedPosition pos2 = pos.getDestination(2);
|
|
|
|
GlStateManager.enableDepth();
|
|
GlStateManager.disableLighting();
|
|
GlStateManager.disableTexture2D();
|
|
GlStateManager.enableBlend();
|
|
renderer.startDrawing(1);
|
|
|
|
renderer.setColorRGBA_I(Color.GREEN.getRGB(), 170);
|
|
|
|
renderer.addVertex(pos2.getX() - pos.getX(), pos2.getY() - pos.getY(), pos2.getZ() - pos.getZ());
|
|
renderer.addVertex(0, 0, 0);
|
|
|
|
Tessellator.getInstance().draw();
|
|
|
|
GlStateManager.enableTexture2D();
|
|
|
|
GlStateManager.rotate((float) -pos.getYaw(), 0, 1, 0);
|
|
GlStateManager.rotate((float) pos.getPitch(), 1, 0, 0);
|
|
GlStateManager.rotate((float) pos.getRoll(), 0, 0, 1);
|
|
|
|
float cubeSize = 0.5f;
|
|
|
|
x = y = z = -cubeSize/2;
|
|
|
|
renderer.startDrawingQuads();
|
|
|
|
renderer.setColorRGBA_I(Color.WHITE.getRGB(), 200);
|
|
|
|
//back
|
|
renderer.addVertexWithUV(x, y + cubeSize, z, 3 * 8 / 64f, 8 / 64f);
|
|
renderer.addVertexWithUV(x + cubeSize, y + cubeSize, z, 4*8/64f, 8/64f);
|
|
renderer.addVertexWithUV(x + cubeSize, y, z, 4*8/64f, 2*8/64f);
|
|
renderer.addVertexWithUV(x, y, z, 3*8/64f, 2*8/64f);
|
|
|
|
//front
|
|
renderer.addVertexWithUV(x + cubeSize, y, z + cubeSize, 2 * 8 / 64f, 2*8/64f);
|
|
renderer.addVertexWithUV(x + cubeSize, y + cubeSize, z + cubeSize, 2 * 8 / 64f, 8/64f);
|
|
renderer.addVertexWithUV(x, y + cubeSize, z + cubeSize, 8 / 64f, 8 / 64f);
|
|
renderer.addVertexWithUV(x, y, z + cubeSize, 8 / 64f, 2*8/64f);
|
|
|
|
//left
|
|
renderer.addVertexWithUV(x + cubeSize, y + cubeSize, z, 0, 8/64f);
|
|
renderer.addVertexWithUV(x + cubeSize, y + cubeSize, z + cubeSize, 8/64f, 8/64f);
|
|
renderer.addVertexWithUV(x + cubeSize, y, z + cubeSize, 8/64f, 2*8/64f);
|
|
renderer.addVertexWithUV(x+cubeSize,y,z, 0, 2*8/64f);
|
|
|
|
//right
|
|
renderer.addVertexWithUV(x, y + cubeSize, z + cubeSize, 2*8/64f, 8/64f);
|
|
renderer.addVertexWithUV(x, y + cubeSize, z, 3*8/64f, 8/64f);
|
|
renderer.addVertexWithUV(x, y, z, 3*8/64f, 2*8/64f);
|
|
renderer.addVertexWithUV(x, y, z + cubeSize, 2 * 8 / 64f, 2 * 8 / 64f);
|
|
|
|
//bottom
|
|
renderer.addVertexWithUV(x + cubeSize, y, z, 3*8/64f, 0);
|
|
renderer.addVertexWithUV(x + cubeSize, y, z + cubeSize, 3*8/64f, 8/64f);
|
|
renderer.addVertexWithUV(x, y, z + cubeSize, 2*8/64f, 8/64f);
|
|
renderer.addVertexWithUV(x, y, z, 2 * 8 / 64f, 0);
|
|
|
|
//top
|
|
renderer.addVertexWithUV(x, y + cubeSize, z, 8/64f, 0);
|
|
renderer.addVertexWithUV(x, y + cubeSize, z + cubeSize, 8/64f, 8/64f);
|
|
renderer.addVertexWithUV(x + cubeSize, y + cubeSize, z + cubeSize, 2*8/64f, 8/64f);
|
|
renderer.addVertexWithUV(x + cubeSize, y + cubeSize, z, 2 * 8 / 64f, 0);
|
|
|
|
Tessellator.getInstance().draw();
|
|
renderer.setTranslation(0, 0, 0);
|
|
|
|
GlStateManager.popMatrix();
|
|
}
|
|
}
|