Split mod into core, recording, replay, render[todo], paths[todo] and extras[wip] modules

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
This commit is contained in:
johni0702
2015-10-03 17:36:03 +02:00
parent 8bd051eb27
commit f925d56ca2
141 changed files with 6294 additions and 5582 deletions

View File

@@ -1,19 +1,8 @@
package eu.crushedpixel.replaymod.renderer;
import eu.crushedpixel.replaymod.assets.CustomImageObject;
import eu.crushedpixel.replaymod.gui.GuiObjectManager;
import eu.crushedpixel.replaymod.holders.Position;
import eu.crushedpixel.replaymod.holders.Transformation;
import eu.crushedpixel.replaymod.replay.ReplayHandler;
import eu.crushedpixel.replaymod.replay.ReplayProcess;
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;
/**
* Allows users to render custom images in the World.
@@ -24,91 +13,92 @@ public class CustomObjectRenderer {
@SubscribeEvent
public void renderCustomObjects(RenderWorldLastEvent event) {
if(!ReplayHandler.isInReplay() || mc.getRenderViewEntity() == null || ReplayHandler.getCustomImageObjects().isEmpty()) return;
double dX = mc.getRenderViewEntity().lastTickPosX + (mc.getRenderViewEntity().posX - mc.getRenderViewEntity().lastTickPosX) * (double)event.partialTicks;
double dY = mc.getRenderViewEntity().lastTickPosY + (mc.getRenderViewEntity().posY - mc.getRenderViewEntity().lastTickPosY) * (double)event.partialTicks;
double dZ = mc.getRenderViewEntity().lastTickPosZ + (mc.getRenderViewEntity().posZ - mc.getRenderViewEntity().lastTickPosZ) * (double)event.partialTicks;
GlStateManager.enableTexture2D();
GlStateManager.enableBlend();
GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
for(CustomImageObject object : ReplayHandler.getCustomImageObjects()) {
drawCustomImageObject(dX, dY, dZ, object);
}
}
private void drawCustomImageObject(double playerX, double playerY, double playerZ, CustomImageObject customImageObject) {
ResourceLocation resourceLocation = customImageObject.getResourceLocation();
if(customImageObject.getLinkedAsset() == null
|| ReplayHandler.getAssetRepository().getAssetByUUID(customImageObject.getLinkedAsset()) == null
|| resourceLocation == null) return;
GlStateManager.pushMatrix();
GlStateManager.pushAttrib();
Tessellator tessellator = Tessellator.getInstance();
WorldRenderer renderer = tessellator.getWorldRenderer();
mc.renderEngine.bindTexture(resourceLocation);
int renderTimestamp;
if(mc.currentScreen instanceof GuiObjectManager) {
renderTimestamp = ((GuiObjectManager) mc.currentScreen).getObjectKeyframeTimeline().cursorPosition;
} else if(ReplayProcess.isVideoRecording()) {
renderTimestamp = ReplayProcess.getVideoRenderer().getVideoTime();
} else {
renderTimestamp = ReplayHandler.getRealTimelineCursor();
}
Transformation transformation = customImageObject.getTransformations().getTransformationForTimestamp(renderTimestamp);
Position objectAnchor = transformation.getAnchor();
Position objectPosition = transformation.getPosition();
Position objectOrientation = transformation.getOrientation();
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((float) -objectOrientation.getX(), 0, 1, 0);
GlStateManager.rotate((float) objectOrientation.getY(), 0, 0, 1);
GlStateManager.rotate((float) objectOrientation.getZ(), 1, 0, 0);
float opacity = (float)transformation.getOpacity() / 100;
GlStateManager.color(1, 1, 1, opacity);
float width = (float)(customImageObject.getWidth() * transformation.getScale().getX() / 100f);
float height = (float)(customImageObject.getHeight() * transformation.getScale().getY() / 100f);
float minX = (float)(-width/2 + objectAnchor.getX());
float maxX = (float)(width/2 + objectAnchor.getX());
float minY = (float)(-height/2 + objectAnchor.getY());
float maxY = (float)(height/2 + objectAnchor.getY());
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);
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.popAttrib();
GlStateManager.popMatrix();
// TODO
// if(!ReplayHandler.isInReplay() || mc.getRenderViewEntity() == null || ReplayHandler.getCustomImageObjects().isEmpty()) return;
//
// double dX = mc.getRenderViewEntity().lastTickPosX + (mc.getRenderViewEntity().posX - mc.getRenderViewEntity().lastTickPosX) * (double)event.partialTicks;
// double dY = mc.getRenderViewEntity().lastTickPosY + (mc.getRenderViewEntity().posY - mc.getRenderViewEntity().lastTickPosY) * (double)event.partialTicks;
// double dZ = mc.getRenderViewEntity().lastTickPosZ + (mc.getRenderViewEntity().posZ - mc.getRenderViewEntity().lastTickPosZ) * (double)event.partialTicks;
//
// GlStateManager.enableTexture2D();
//
// GlStateManager.enableBlend();
// GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
//
// for(CustomImageObject object : ReplayHandler.getCustomImageObjects()) {
// drawCustomImageObject(dX, dY, dZ, object);
// }
// }
//
// private void drawCustomImageObject(double playerX, double playerY, double playerZ, CustomImageObject customImageObject) {
// ResourceLocation resourceLocation = customImageObject.getResourceLocation();
//
// if(customImageObject.getLinkedAsset() == null
// || ReplayHandler.getAssetRepository().getAssetByUUID(customImageObject.getLinkedAsset()) == null
// || resourceLocation == null) return;
//
// GlStateManager.pushMatrix();
// GlStateManager.pushAttrib();
//
// Tessellator tessellator = Tessellator.getInstance();
// WorldRenderer renderer = tessellator.getWorldRenderer();
//
// mc.renderEngine.bindTexture(resourceLocation);
//
// int renderTimestamp;
// if(mc.currentScreen instanceof GuiObjectManager) {
// renderTimestamp = ((GuiObjectManager) mc.currentScreen).getObjectKeyframeTimeline().cursorPosition;
// } else if(ReplayProcess.isVideoRecording()) {
// renderTimestamp = ReplayProcess.getVideoRenderer().getVideoTime();
// } else {
// renderTimestamp = ReplayHandler.getRealTimelineCursor();
// }
//
// Transformation transformation = customImageObject.getTransformations().getTransformationForTimestamp(renderTimestamp);
//
// Position objectAnchor = transformation.getAnchor();
// Position objectPosition = transformation.getPosition();
// Position objectOrientation = transformation.getOrientation();
//
// 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((float) -objectOrientation.getX(), 0, 1, 0);
// GlStateManager.rotate((float) objectOrientation.getY(), 0, 0, 1);
// GlStateManager.rotate((float) objectOrientation.getZ(), 1, 0, 0);
//
// float opacity = (float)transformation.getOpacity() / 100;
// GlStateManager.color(1, 1, 1, opacity);
//
// float width = (float)(customImageObject.getWidth() * transformation.getScale().getX() / 100f);
// float height = (float)(customImageObject.getHeight() * transformation.getScale().getY() / 100f);
//
// float minX = (float)(-width/2 + objectAnchor.getX());
// float maxX = (float)(width/2 + objectAnchor.getX());
// float minY = (float)(-height/2 + objectAnchor.getY());
// float maxY = (float)(height/2 + objectAnchor.getY());
//
// 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);
//
// 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.popAttrib();
// GlStateManager.popMatrix();
}
}

View File

@@ -1,8 +1,5 @@
package eu.crushedpixel.replaymod.renderer;
import eu.crushedpixel.replaymod.registry.PlayerHandler;
import eu.crushedpixel.replaymod.replay.ReplayHandler;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.culling.ICamera;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.client.renderer.entity.RenderPlayer;
@@ -20,8 +17,10 @@ public class InvisibilityRender extends RenderPlayer {
@Override
public boolean shouldRender(Entity entity, ICamera camera, double camX, double camY, double camZ) {
return !(PlayerHandler.isHidden(entity.getUniqueID()) || (ReplayHandler.isInReplay()
&& entity == Minecraft.getMinecraft().thePlayer))
&& super.shouldRender(entity, camera, camX, camY, camZ);
// TODO
return false;
// return !(PlayerHandler.isHidden(entity.getUniqueID()) || (ReplayHandler.isInReplay()
// && entity == Minecraft.getMinecraft().thePlayer))
// && super.shouldRender(entity, camera, camX, camY, camZ);
}
}

View File

@@ -1,28 +1,23 @@
package eu.crushedpixel.replaymod.renderer;
import eu.crushedpixel.replaymod.ReplayMod;
import eu.crushedpixel.replaymod.events.KeyframesModifyEvent;
import eu.crushedpixel.replaymod.gui.overlay.GuiReplayOverlay;
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 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.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.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import static com.replaymod.core.ReplayMod.TEXTURE;
public class PathPreviewRenderer {
@@ -38,83 +33,85 @@ public class PathPreviewRenderer {
@SubscribeEvent
public void renderCameraPath(RenderWorldLastEvent event) {
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();
// 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) {
keyframes = ReplayHandler.getPositionKeyframes();
// TODO
// keyframes = ReplayHandler.getPositionKeyframes();
}
private class DistanceComparator implements Comparator<Keyframe<AdvancedPosition>> {
@@ -172,7 +169,7 @@ public class PathPreviewRenderer {
Tessellator tessellator = Tessellator.getInstance();
WorldRenderer renderer = tessellator.getWorldRenderer();
mc.renderEngine.bindTexture(GuiReplayOverlay.replay_gui);
mc.renderEngine.bindTexture(TEXTURE);
AdvancedPosition pos1 = kf.getValue();
@@ -197,9 +194,10 @@ public class PathPreviewRenderer {
float size = 10/128f;
if(kf.equals(ReplayHandler.getSelectedKeyframe())) {
posY += size;
}
// TODO
// if(kf.equals(ReplayHandler.getSelectedKeyframe())) {
// posY += size;
// }
if(pos1 instanceof SpectatorData) {
posX += size;