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:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user